diff options
author | DongHun Kwak <dh0128.kwak@samsung.com> | 2021-02-09 16:00:17 +0900 |
---|---|---|
committer | DongHun Kwak <dh0128.kwak@samsung.com> | 2021-02-09 16:00:17 +0900 |
commit | f77eedfaad1525168ca8593a3eb43ef157cd2891 (patch) | |
tree | d27f4bf63522695f544f14b5729b48986308237e /common/exectool.c | |
parent | 10fb3b7f1c67c9367ab0b15e2d8e4b5ec6abbae0 (diff) | |
download | gpg2-f77eedfaad1525168ca8593a3eb43ef157cd2891.tar.gz gpg2-f77eedfaad1525168ca8593a3eb43ef157cd2891.tar.bz2 gpg2-f77eedfaad1525168ca8593a3eb43ef157cd2891.zip |
Imported Upstream version 2.1.18upstream/2.1.18
Diffstat (limited to 'common/exectool.c')
-rw-r--r-- | common/exectool.c | 60 |
1 files changed, 38 insertions, 22 deletions
diff --git a/common/exectool.c b/common/exectool.c index 4593abd..ed8225a 100644 --- a/common/exectool.c +++ b/common/exectool.c @@ -232,36 +232,38 @@ copy_buffer_do_copy (struct copy_buffer *c, estream_t source, estream_t sink) if (c->nread == 0) { c->writep = c->buffer; - err = es_read (source, c->buffer, sizeof c->buffer, &c->nread); - if (err) + if (es_read (source, c->buffer, sizeof c->buffer, &c->nread)) { - if (errno == EAGAIN) + err = my_error_from_syserror (); + if (gpg_err_code (err) == GPG_ERR_EAGAIN) return 0; /* We will just retry next time. */ - return my_error_from_syserror (); + return err; } - assert (c->nread <= sizeof c->buffer); + log_assert (c->nread <= sizeof c->buffer); } if (c->nread == 0) return 0; /* Done copying. */ - nwritten = 0; - err = sink? es_write (sink, c->writep, c->nread, &nwritten) : 0; + if (sink && es_write (sink, c->writep, c->nread, &nwritten)) + err = my_error_from_syserror (); + else + err = 0; - assert (nwritten <= c->nread); + log_assert (nwritten <= c->nread); c->writep += nwritten; c->nread -= nwritten; - assert (c->writep - c->buffer <= sizeof c->buffer); + log_assert (c->writep - c->buffer <= sizeof c->buffer); if (err) { - if (errno == EAGAIN) + if (gpg_err_code (err) == GPG_ERR_EAGAIN) return 0; /* We will just retry next time. */ - return my_error_from_syserror (); + return err; } if (sink && es_fflush (sink) && errno != EAGAIN) @@ -275,16 +277,24 @@ copy_buffer_do_copy (struct copy_buffer *c, estream_t source, estream_t sink) static gpg_error_t copy_buffer_flush (struct copy_buffer *c, estream_t sink) { - gpg_error_t err; + gpg_error_t err = 0; + size_t nwritten = 0; - while (c->nread > 0) - { - err = copy_buffer_do_copy (c, NULL, sink); - if (err) - return err; - } + if (es_write (sink, c->writep, c->nread, &nwritten)) + err = my_error_from_syserror (); + + log_assert (nwritten <= c->nread); + c->writep += nwritten; + c->nread -= nwritten; + log_assert (c->writep - c->buffer <= sizeof c->buffer); + + if (err) + return err; + + if (es_fflush (sink)) + err = my_error_from_syserror (); - return 0; + return err; } @@ -444,6 +454,8 @@ gnupg_exec_tool_stream (const char *pgmname, const char *argv[], if (es_feof (input)) { err = copy_buffer_flush (cpbuf_in, fds[0].stream); + if (gpg_err_code (err) == GPG_ERR_EAGAIN) + continue; /* Retry next time. */ if (err) { log_error ("error feeding data to '%s': %s\n", @@ -470,6 +482,8 @@ gnupg_exec_tool_stream (const char *pgmname, const char *argv[], if (es_feof (inextra)) { err = copy_buffer_flush (cpbuf_extra, fds[3].stream); + if (gpg_err_code (err) == GPG_ERR_EAGAIN) + continue; /* Retry next time. */ if (err) { log_error ("error feeding data to '%s': %s\n", @@ -606,9 +620,11 @@ gnupg_exec_tool (const char *pgmname, const char *argv[], if (len) { - err = es_read (output, *result, len, &nread); - if (err) - goto leave; + if (es_read (output, *result, len, &nread)) + { + err = my_error_from_syserror (); + goto leave; + } if (nread != len) log_fatal ("%s: short read from memstream\n", __func__); } |