Revert ECPG's use of pnstrdup()

Commit 0b9466fce added a dependency on fe_memutils' pnstrdup() inside
informix.c.  This adds an exit() path in a library, which we don't
want.  (Unlike libpq, the ecpg libraries don't have an automated check
for that, but it makes sense to keep them to a similar standard.)  The
ecpg code can already handle failure results from the *strdup() call
by itself.

Author: Jacob Champion <jacob.champion@enterprisedb.com>
Discussion: https://www.postgresql.org/message-id/CAOYmi+=pg=W5L1h=3MEP_EB24jaBu2FyATrLXqQHGe7cpuvwyg@mail.gmail.com
This commit is contained in:
Peter Eisentraut 2024-08-07 09:21:07 +02:00
parent de35207015
commit 2de129b356
1 changed files with 21 additions and 2 deletions

View File

@ -175,6 +175,25 @@ deccopy(decimal *src, decimal *target)
memcpy(target, src, sizeof(decimal)); memcpy(target, src, sizeof(decimal));
} }
static char *
ecpg_strndup(const char *str, size_t len)
{
size_t real_len = strlen(str);
int use_len = (int) ((real_len > len) ? len : real_len);
char *new = malloc(use_len + 1);
if (new)
{
memcpy(new, str, use_len);
new[use_len] = '\0';
}
else
errno = ENOMEM;
return new;
}
int int
deccvasc(const char *cp, int len, decimal *np) deccvasc(const char *cp, int len, decimal *np)
{ {
@ -186,7 +205,7 @@ deccvasc(const char *cp, int len, decimal *np)
if (risnull(CSTRINGTYPE, cp)) if (risnull(CSTRINGTYPE, cp))
return 0; return 0;
str = pnstrdup(cp, len); /* decimal_in always converts the complete str = ecpg_strndup(cp, len); /* decimal_in always converts the complete
* string */ * string */
if (!str) if (!str)
ret = ECPG_INFORMIX_NUM_UNDERFLOW; ret = ECPG_INFORMIX_NUM_UNDERFLOW;