diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog index 17913d68..29f496d1 100644 --- a/gpgme/ChangeLog +++ b/gpgme/ChangeLog @@ -1,3 +1,8 @@ +2007-08-22 Marcus Brinkmann + + * w32-io.c (_gpgme_io_write): Return early if COUNT is zero. + (writer): Remove superfluous check. + 2007-08-20 Marcus Brinkmann * gpgme.h: Move include of gpg-error.h out of extern "C". diff --git a/gpgme/w32-io.c b/gpgme/w32-io.c index f7453711..dfdf45e5 100644 --- a/gpgme/w32-io.c +++ b/gpgme/w32-io.c @@ -531,20 +531,22 @@ writer (void *arg) UNLOCK (ctx->mutex); TRACE_LOG1 ("writing %d bytes", ctx->nbytes); - if (ctx->nbytes - && !WriteFile (ctx->file_hd, ctx->buffer, - ctx->nbytes, &nwritten, NULL)) - { - ctx->error_code = (int) GetLastError (); - ctx->error = 1; - TRACE_LOG1 ("write error: ec=%d", ctx->error_code); - break; - } - TRACE_LOG1 ("wrote %d bytes", (int) nwritten); + /* Note that CTX->nbytes is not zero at this point, because + _gpgme_io_write always writes at least 1 byte before waking + us up, unless CTX->stop_me is true, which we catch above. */ + if (!WriteFile (ctx->file_hd, ctx->buffer, + ctx->nbytes, &nwritten, NULL)) + { + ctx->error_code = (int) GetLastError (); + ctx->error = 1; + TRACE_LOG1 ("write error: ec=%d", ctx->error_code); + break; + } + TRACE_LOG1 ("wrote %d bytes", (int) nwritten); - LOCK (ctx->mutex); - ctx->nbytes -= nwritten; - UNLOCK (ctx->mutex); + LOCK (ctx->mutex); + ctx->nbytes -= nwritten; + UNLOCK (ctx->mutex); } /* Indicate that we have an error. */ if (!SetEvent (ctx->is_empty)) @@ -724,6 +726,9 @@ _gpgme_io_write (int fd, const void *buffer, size_t count) "buffer=%p, count=%u", buffer, count); TRACE_LOGBUF (buffer, count); + if (count == 0) + return TRACE_SYS (0); + ctx = find_writer (fd, 1); if (!ctx) return TRACE_SYSRES (-1);