common: Make gnupg_exec_tool conform to spec.
authorWerner Koch <wk@gnupg.org>
Tue, 2 Feb 2016 17:18:31 +0000 (18:18 +0100)
committerWerner Koch <wk@gnupg.org>
Sat, 13 Feb 2016 16:06:38 +0000 (17:06 +0100)
* common/exectool.c (gnupg_exec_tool): Allocate extra byte.  Allow
zero length read.  Append hidden byte.  Release memory on error.
--

Signed-off-by: Werner Koch <wk@gnupg.org>
common/exectool.c

index 766ee94..7b3a8f1 100644 (file)
@@ -417,24 +417,33 @@ gnupg_exec_tool (const char *pgmname, const char *argv[],
   if (err)
     goto leave;
 
-  *result = xtrymalloc (len);
-  if (*result == NULL)
+  *result = xtrymalloc (len + 1);
+  if (!*result)
     {
       err = my_error_from_syserror ();
       goto leave;
     }
 
-  err = es_read (output, *result, len, &nread);
-  if (! err)
+  if (len)
     {
-      assert (nread == len || !"short read on memstream");
-      if (resultlen)
-        *resultlen = len;
+      err = es_read (output, *result, len, &nread);
+      if (err)
+        goto leave;
+      if (nread != len)
+        log_fatal ("%s: short read from memstream\n", __func__);
     }
+  (*result)[len] = 0;
+
+  if (resultlen)
+    *resultlen = len;
 
  leave:
-  if (input)
-    es_fclose (input);
+  es_fclose (input);
   es_fclose (output);
+  if (err)
+    {
+      xfree (*result);
+      *result = NULL;
+    }
   return err;
 }