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