aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2016-02-02 17:18:31 +0000
committerWerner Koch <[email protected]>2016-02-13 16:06:38 +0000
commitd19d6e1856c9a1acbf48e8b2e39b3d9171aa9f7f (patch)
treef5cd6311df9f472e0eda42fa3bd51fa601c30c7f
parentg13: First chunk of code to support dm-crypt. (diff)
downloadgnupg-d19d6e1856c9a1acbf48e8b2e39b3d9171aa9f7f.tar.gz
gnupg-d19d6e1856c9a1acbf48e8b2e39b3d9171aa9f7f.zip
common: Make gnupg_exec_tool conform to spec.
* 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 <[email protected]>
-rw-r--r--common/exectool.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/common/exectool.c b/common/exectool.c
index 766ee94c7..7b3a8f1b5 100644
--- a/common/exectool.c
+++ b/common/exectool.c
@@ -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;
}