striconveh: Don't malloc memory if the result buffer is sufficient.
authorBruno Haible <bruno@clisp.org>
Tue, 13 Jul 2010 21:36:41 +0000 (23:36 +0200)
committerBruno Haible <bruno@clisp.org>
Tue, 13 Jul 2010 21:36:41 +0000 (23:36 +0200)
ChangeLog
lib/striconveh.c

index 10d49b1..3ffe6b5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2010-07-13  Bruno Haible  <bruno@clisp.org>
 
+       striconveh: Don't malloc memory if the result buffer is sufficient.
+       * lib/striconveh.c (mem_cd_iconveh_internal): Use the provided result
+       buffer if its size is sufficient.
+       Reported by Ludovic Courtès <ludo@gnu.org>.
+
+2010-07-13  Bruno Haible  <bruno@clisp.org>
+
        strtod: Add safety check.
        * lib/strtod.c (ldexp): Abort if this dummy replacement gets called.
 
index e448a99..9467e4d 100644 (file)
@@ -970,18 +970,27 @@ mem_cd_iconveh_internal (const char *src, size_t srclen,
   if (result == tmpbuf)
     {
       size_t memsize = length + extra_alloc;
-      char *memory;
 
-      memory = (char *) malloc (memsize > 0 ? memsize : 1);
-      if (memory != NULL)
+      if (*resultp != NULL && *lengthp >= memsize)
         {
-          memcpy (memory, tmpbuf, length);
-          result = memory;
+          result = *resultp;
+          memcpy (result, tmpbuf, length);
         }
       else
         {
-          errno = ENOMEM;
-          return -1;
+          char *memory;
+
+          memory = (char *) malloc (memsize > 0 ? memsize : 1);
+          if (memory != NULL)
+            {
+              memcpy (memory, tmpbuf, length);
+              result = memory;
+            }
+          else
+            {
+              errno = ENOMEM;
+              return -1;
+            }
         }
     }
   else if (result != *resultp && length + extra_alloc < allocated)