striconveh: Don't malloc memory if the result buffer is sufficient.
[gnulib.git] / lib / striconveh.c
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)