common: Fix copying data to estreams.
authorJustus Winter <justus@g10code.com>
Tue, 18 Oct 2016 15:57:19 +0000 (17:57 +0200)
committerJustus Winter <justus@g10code.com>
Tue, 18 Oct 2016 16:54:49 +0000 (18:54 +0200)
* common/exectool.c (copy_buffer_do_copy): Correctly account for
partially written data in the event of errors.

Signed-off-by: Justus Winter <justus@g10code.com>
common/exectool.c

index e46071c..cf54efe 100644 (file)
@@ -248,7 +248,14 @@ copy_buffer_do_copy (struct copy_buffer *c, estream_t source, estream_t sink)
     return 0;  /* Done copying.  */
 
 
+  nwritten = 0;
   err = sink? es_write (sink, c->writep, c->nread, &nwritten) : 0;
+
+  assert (nwritten <= c->nread);
+  c->writep += nwritten;
+  c->nread -= nwritten;
+  assert (c->writep - c->buffer <= sizeof c->buffer);
+
   if (err)
     {
       if (errno == EAGAIN)
@@ -257,11 +264,6 @@ copy_buffer_do_copy (struct copy_buffer *c, estream_t source, estream_t sink)
       return my_error_from_syserror ();
     }
 
-  assert (nwritten <= c->nread);
-  c->writep += nwritten;
-  c->nread -= nwritten;
-  assert (c->writep - c->buffer <= sizeof c->buffer);
-
   if (sink && es_fflush (sink) && errno != EAGAIN)
     err = my_error_from_syserror ();