diff options
author | Werner Koch <[email protected]> | 2016-02-02 17:18:31 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2016-02-13 16:06:38 +0000 |
commit | d19d6e1856c9a1acbf48e8b2e39b3d9171aa9f7f (patch) | |
tree | f5cd6311df9f472e0eda42fa3bd51fa601c30c7f | |
parent | g13: First chunk of code to support dm-crypt. (diff) | |
download | gnupg-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.c | 27 |
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; } |