Revert ECPG's use of pnstrdup()
authorPeter Eisentraut <[email protected]>
Wed, 7 Aug 2024 07:21:07 +0000 (09:21 +0200)
committerPeter Eisentraut <[email protected]>
Wed, 7 Aug 2024 07:21:07 +0000 (09:21 +0200)
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 <[email protected]>
Discussion: https://www.postgresql.org/message-id/CAOYmi+=pg=W5L1h=3MEP_EB24jaBu2FyATrLXqQHGe7cpuvwyg@mail.gmail.com

src/interfaces/ecpg/compatlib/informix.c

index 8ea89e640a0838945560b76a20af885900eae70a..65a0b2e46c4c85ee9357d79419fde36778960d19 100644 (file)
@@ -175,6 +175,25 @@ deccopy(decimal *src, decimal *target)
    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
 deccvasc(const char *cp, int len, decimal *np)
 {
@@ -186,8 +205,8 @@ deccvasc(const char *cp, int len, decimal *np)
    if (risnull(CSTRINGTYPE, cp))
        return 0;
 
-   str = pnstrdup(cp, len);    /* decimal_in always converts the complete
-                                * string */
+   str = ecpg_strndup(cp, len);    /* decimal_in always converts the complete
+                                    * string */
    if (!str)
        ret = ECPG_INFORMIX_NUM_UNDERFLOW;
    else