1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-06-05 23:07:49 +02:00

common: Rework resource cleanup when handling errors.

* common/exectool.c (gnupg_exec_tool_stream): Rework error handling.

Signed-off-by: Justus Winter <justus@g10code.com>
This commit is contained in:
Justus Winter 2016-07-26 14:31:11 +02:00
parent fe40e9c53d
commit 35132a8b11

View File

@ -1,5 +1,6 @@
/* exectool.c - Utility functions to execute a helper tool /* exectool.c - Utility functions to execute a helper tool
* Copyright (C) 2015 Werner Koch * Copyright (C) 2015 Werner Koch
* Copyright (C) 2016 g10 Code GmbH
* *
* This file is part of GnuPG. * This file is part of GnuPG.
* *
@ -303,10 +304,10 @@ gnupg_exec_tool_stream (const char *pgmname, const char *argv[],
void *status_cb_value) void *status_cb_value)
{ {
gpg_error_t err; gpg_error_t err;
pid_t pid; pid_t pid = (pid_t) -1;
estream_t infp = NULL; estream_t infp = NULL;
estream_t extrafp = NULL; estream_t extrafp = NULL;
estream_t outfp, errfp; estream_t outfp = NULL, errfp = NULL;
es_poll_t fds[4]; es_poll_t fds[4];
int exceptclose[2]; int exceptclose[2];
int extrapipe[2] = {-1, -1}; int extrapipe[2] = {-1, -1};
@ -329,7 +330,10 @@ gnupg_exec_tool_stream (const char *pgmname, const char *argv[],
fderrstate.buffer_size = 256; fderrstate.buffer_size = 256;
fderrstate.buffer = xtrymalloc (fderrstate.buffer_size); fderrstate.buffer = xtrymalloc (fderrstate.buffer_size);
if (!fderrstate.buffer) if (!fderrstate.buffer)
return my_error_from_syserror (); {
err = my_error_from_syserror ();
goto leave;
}
if (inextra) if (inextra)
{ {
@ -338,8 +342,7 @@ gnupg_exec_tool_stream (const char *pgmname, const char *argv[],
{ {
log_error ("error running outbound pipe for extra fp: %s\n", log_error ("error running outbound pipe for extra fp: %s\n",
gpg_strerror (err)); gpg_strerror (err));
xfree (fderrstate.buffer); goto leave;
return err;
} }
exceptclose[0] = extrapipe[0]; /* Do not close in child. */ exceptclose[0] = extrapipe[0]; /* Do not close in child. */
exceptclose[1] = -1; exceptclose[1] = -1;
@ -369,9 +372,7 @@ gnupg_exec_tool_stream (const char *pgmname, const char *argv[],
if (err) if (err)
{ {
log_error ("error running '%s': %s\n", pgmname, gpg_strerror (err)); log_error ("error running '%s': %s\n", pgmname, gpg_strerror (err));
es_fclose (extrafp); goto leave;
xfree (fderrstate.buffer);
return err;
} }
fds[0].stream = infp; fds[0].stream = infp;
@ -494,7 +495,7 @@ gnupg_exec_tool_stream (const char *pgmname, const char *argv[],
pid = (pid_t)(-1); pid = (pid_t)(-1);
leave: leave:
if (err) if (err && pid != (pid_t) -1)
gnupg_kill_process (pid); gnupg_kill_process (pid);
es_fclose (infp); es_fclose (infp);