diff options
author | Justus Winter <[email protected]> | 2017-01-23 14:08:23 +0000 |
---|---|---|
committer | Justus Winter <[email protected]> | 2017-01-23 14:08:23 +0000 |
commit | 6f02133bb07726afa6950e5b4685e75621276e60 (patch) | |
tree | 83433df52821ea93dad71effa35c58f02c25233d /src/w32-io.c | |
parent | tests: Add safeguards against nullptr deref (diff) | |
download | gpgme-6f02133bb07726afa6950e5b4685e75621276e60.tar.gz gpgme-6f02133bb07726afa6950e5b4685e75621276e60.zip |
w32: Fix closing file descriptors.
* src/w32-io.c (writer): Only stop once the buffer is drained.
(destroy_writer): Wait for the writers buffer to be drained. This
aligns '_gpgme_io_close's behavior with close(2) and fclose(3).
GnuPG-bug-id: 2881
Signed-off-by: Justus Winter <[email protected]>
Diffstat (limited to 'src/w32-io.c')
-rw-r--r-- | src/w32-io.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/w32-io.c b/src/w32-io.c index 0d1c810e..6302ad97 100644 --- a/src/w32-io.c +++ b/src/w32-io.c @@ -700,7 +700,7 @@ writer (void *arg) for (;;) { LOCK (ctx->mutex); - if (ctx->stop_me) + if (ctx->stop_me && !ctx->nbytes) { UNLOCK (ctx->mutex); break; @@ -717,7 +717,7 @@ writer (void *arg) TRACE_LOG ("got data to send"); LOCK (ctx->mutex); } - if (ctx->stop_me) + if (ctx->stop_me && !ctx->nbytes) { UNLOCK (ctx->mutex); break; @@ -776,6 +776,9 @@ writer (void *arg) TRACE_LOG ("waiting for close"); WaitForSingleObject (ctx->close_ev, INFINITE); + if (ctx->nbytes) + TRACE_LOG1 ("still %d bytes in buffer at close time", ctx->nbytes); + CloseHandle (ctx->close_ev); CloseHandle (ctx->have_data); CloseHandle (ctx->is_empty); @@ -892,6 +895,9 @@ destroy_writer (struct writer_context_s *ctx) SetEvent (ctx->have_data); UNLOCK (ctx->mutex); + /* Give the writer a chance to flush the buffer. */ + WaitForSingleObject (ctx->is_empty, INFINITE); + #ifdef HAVE_W32CE_SYSTEM /* Scenario: We never create a full pipe, but already started writing more than the pipe buffer. Then we need to unblock the |