summaryrefslogtreecommitdiff
path: root/common/exectool.c
diff options
context:
space:
mode:
authorDongHun Kwak <dh0128.kwak@samsung.com>2021-02-09 16:00:17 +0900
committerDongHun Kwak <dh0128.kwak@samsung.com>2021-02-09 16:00:17 +0900
commitf77eedfaad1525168ca8593a3eb43ef157cd2891 (patch)
treed27f4bf63522695f544f14b5729b48986308237e /common/exectool.c
parent10fb3b7f1c67c9367ab0b15e2d8e4b5ec6abbae0 (diff)
downloadgpg2-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.c60
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__);
}