w32: Log all errors from CloseHandle and WFSO in w32-io.

* src/w32-io.c (close_handle, _close_handle): New macro and function;
use in place of all CloseHandle calls.
(wait_for_single_object, _wait_for_single_object): Likewise.

Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
Werner Koch 2018-11-02 12:28:17 +01:00
parent 4faa0ccf58
commit ed3f5ad760
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B

View File

@ -161,6 +161,36 @@ DEFINE_STATIC_LOCK (hddesc_lock);
/* Wrapper around CloseHandle to print an error. */
#define close_handle(hd) _close_handle ((hd), __LINE__);
static void
_close_handle (HANDLE hd, int line)
{
if (!CloseHandle (hd))
{
TRACE2 (DEBUG_INIT, "w32-io", hd, "CloseHandle failed at line %d: ec=%d",
line, (int) GetLastError ());
}
}
/* Wrapper around WaitForSingleObject to print an error. */
#define wait_for_single_object(hd,msec) \
_wait_for_single_object ((hd), (msec), __LINE__)
static DWORD
_wait_for_single_object (HANDLE hd, DWORD msec, int line)
{
DWORD res;
res = WaitForSingleObject (hd, msec);
if (res == WAIT_FAILED)
{
TRACE2 (DEBUG_INIT, "w32-io", hd,
"WFSO failed at line %d: ec=%d", line, (int) GetLastError ());
}
return res;
}
/* Create a new handle descriptor object. */
static hddesc_t
new_hddesc (void)
@ -207,13 +237,8 @@ release_hddesc (hddesc_t hdd)
hdd->hd, hdd->sock, hdd->refcount);
if (hdd->hd != INVALID_HANDLE_VALUE)
{
TRACE_LOG1 ("closing handle %p", hdd->hd);
if (!CloseHandle (hdd->hd))
{
TRACE_LOG1 ("CloseHandle failed: ec=%d", (int) GetLastError ());
}
}
close_handle (hdd->hd);
if (hdd->sock != INVALID_SOCKET)
{
TRACE_LOG1 ("closing socket %d", hdd->sock);
@ -352,7 +377,7 @@ reader (void *arg)
}
UNLOCK (ctx->mutex);
TRACE_LOG1 ("waiting for space (refcnt=%d)", ctx->refcount);
WaitForSingleObject (ctx->have_space_ev, INFINITE);
wait_for_single_object (ctx->have_space_ev, INFINITE);
TRACE_LOG ("got space");
LOCK (ctx->mutex);
}
@ -462,13 +487,13 @@ reader (void *arg)
}
TRACE_LOG ("waiting for close");
WaitForSingleObject (ctx->close_ev, INFINITE);
wait_for_single_object (ctx->close_ev, INFINITE);
release_hddesc (ctx->hdd);
CloseHandle (ctx->close_ev);
CloseHandle (ctx->have_data_ev);
CloseHandle (ctx->have_space_ev);
CloseHandle (ctx->thread_hd);
close_handle (ctx->close_ev);
close_handle (ctx->have_data_ev);
close_handle (ctx->have_space_ev);
close_handle (ctx->thread_hd);
DESTROY_LOCK (ctx->mutex);
free (ctx);
@ -514,11 +539,11 @@ create_reader (hddesc_t hdd)
{
TRACE_LOG1 ("CreateEvent failed: ec=%d", (int) GetLastError ());
if (ctx->have_data_ev)
CloseHandle (ctx->have_data_ev);
close_handle (ctx->have_data_ev);
if (ctx->have_space_ev)
CloseHandle (ctx->have_space_ev);
close_handle (ctx->have_space_ev);
if (ctx->close_ev)
CloseHandle (ctx->close_ev);
close_handle (ctx->close_ev);
release_hddesc (ctx->hdd);
free (ctx);
TRACE_SYSERR (EIO);
@ -534,11 +559,11 @@ create_reader (hddesc_t hdd)
TRACE_LOG1 ("CreateThread failed: ec=%d", (int) GetLastError ());
DESTROY_LOCK (ctx->mutex);
if (ctx->have_data_ev)
CloseHandle (ctx->have_data_ev);
close_handle (ctx->have_data_ev);
if (ctx->have_space_ev)
CloseHandle (ctx->have_space_ev);
close_handle (ctx->have_space_ev);
if (ctx->close_ev)
CloseHandle (ctx->close_ev);
close_handle (ctx->close_ev);
release_hddesc (ctx->hdd);
free (ctx);
TRACE_SYSERR (EIO);
@ -668,7 +693,7 @@ _gpgme_io_read (int fd, void *buffer, size_t count)
/* No data available. */
UNLOCK (ctx->mutex);
TRACE_LOG1 ("waiting for data from thread %p", ctx->thread_hd);
WaitForSingleObject (ctx->have_data_ev, INFINITE);
wait_for_single_object (ctx->have_data_ev, INFINITE);
TRACE_LOG1 ("data from thread %p available", ctx->thread_hd);
LOCK (ctx->mutex);
}
@ -756,7 +781,7 @@ writer (void *arg)
TRACE_LOG1 ("ResetEvent failed: ec=%d", (int) GetLastError ());
UNLOCK (ctx->mutex);
TRACE_LOG ("idle");
WaitForSingleObject (ctx->have_data, INFINITE);
wait_for_single_object (ctx->have_data, INFINITE);
TRACE_LOG ("got data to send");
LOCK (ctx->mutex);
}
@ -817,16 +842,16 @@ writer (void *arg)
TRACE_LOG1 ("SetEvent failed: ec=%d", (int) GetLastError ());
TRACE_LOG ("waiting for close");
WaitForSingleObject (ctx->close_ev, INFINITE);
wait_for_single_object (ctx->close_ev, INFINITE);
if (ctx->nbytes)
TRACE_LOG1 ("still %d bytes in buffer at close time", ctx->nbytes);
release_hddesc (ctx->hdd);
CloseHandle (ctx->close_ev);
CloseHandle (ctx->have_data);
CloseHandle (ctx->is_empty);
CloseHandle (ctx->thread_hd);
close_handle (ctx->close_ev);
close_handle (ctx->have_data);
close_handle (ctx->is_empty);
close_handle (ctx->thread_hd);
DESTROY_LOCK (ctx->mutex);
free (ctx);
@ -869,11 +894,11 @@ TRACE_BEG3 (DEBUG_SYSIO, "gpgme:create_writer", hdd,
{
TRACE_LOG1 ("CreateEvent failed: ec=%d", (int) GetLastError ());
if (ctx->have_data)
CloseHandle (ctx->have_data);
close_handle (ctx->have_data);
if (ctx->is_empty)
CloseHandle (ctx->is_empty);
close_handle (ctx->is_empty);
if (ctx->close_ev)
CloseHandle (ctx->close_ev);
close_handle (ctx->close_ev);
release_hddesc (ctx->hdd);
free (ctx);
/* FIXME: Translate the error code. */
@ -889,11 +914,11 @@ TRACE_BEG3 (DEBUG_SYSIO, "gpgme:create_writer", hdd,
TRACE_LOG1 ("CreateThread failed: ec=%d", (int) GetLastError ());
DESTROY_LOCK (ctx->mutex);
if (ctx->have_data)
CloseHandle (ctx->have_data);
close_handle (ctx->have_data);
if (ctx->is_empty)
CloseHandle (ctx->is_empty);
close_handle (ctx->is_empty);
if (ctx->close_ev)
CloseHandle (ctx->close_ev);
close_handle (ctx->close_ev);
release_hddesc (ctx->hdd);
free (ctx);
TRACE_SYSERR (EIO);
@ -932,7 +957,7 @@ destroy_writer (struct writer_context_s *ctx)
UNLOCK (ctx->mutex);
/* Give the writer a chance to flush the buffer. */
WaitForSingleObject (ctx->is_empty, INFINITE);
wait_for_single_object (ctx->is_empty, INFINITE);
/* After setting this event CTX is void. */
SetEvent (ctx->close_ev);
@ -1014,7 +1039,7 @@ _gpgme_io_write (int fd, const void *buffer, size_t count)
}
UNLOCK (ctx->mutex);
TRACE_LOG1 ("waiting for empty buffer in thread %p", ctx->thread_hd);
WaitForSingleObject (ctx->is_empty, INFINITE);
wait_for_single_object (ctx->is_empty, INFINITE);
TRACE_LOG1 ("thread %p buffer is empty", ctx->thread_hd);
LOCK (ctx->mutex);
}
@ -1131,14 +1156,14 @@ _gpgme_io_pipe (int filedes[2], int inherit_idx)
(int) GetLastError ());
release_fd (rfd);
release_fd (wfd);
CloseHandle (rh);
CloseHandle (wh);
close_handle (rh);
close_handle (wh);
release_hddesc (rhdesc);
release_hddesc (whdesc);
gpg_err_set_errno (EIO);
return TRACE_SYSRES (-1);
}
CloseHandle (rh);
close_handle (rh);
rh = hd;
}
else if (inherit_idx == 1)
@ -1152,14 +1177,14 @@ _gpgme_io_pipe (int filedes[2], int inherit_idx)
(int) GetLastError ());
release_fd (rfd);
release_fd (wfd);
CloseHandle (rh);
CloseHandle (wh);
close_handle (rh);
close_handle (wh);
release_hddesc (rhdesc);
release_hddesc (whdesc);
gpg_err_set_errno (EIO);
return TRACE_SYSRES (-1);
}
CloseHandle (wh);
close_handle (wh);
wh = hd;
}
@ -1500,8 +1525,8 @@ _gpgme_io_spawn (const char *path, char *const argv[], unsigned int flags,
/* Just in case TerminateProcess didn't work, let the
process fail on its own. */
ResumeThread (pi.hThread);
CloseHandle (pi.hThread);
CloseHandle (pi.hProcess);
close_handle (pi.hThread);
close_handle (pi.hProcess);
close (tmp_fd);
DeleteFileA (tmp_name);
@ -1577,16 +1602,12 @@ _gpgme_io_spawn (const char *path, char *const argv[], unsigned int flags,
if (ResumeThread (pi.hThread) < 0)
TRACE_LOG1 ("ResumeThread failed: ec=%d", (int) GetLastError ());
if (!CloseHandle (pi.hThread))
TRACE_LOG1 ("CloseHandle of thread failed: ec=%d",
(int) GetLastError ());
close_handle (pi.hThread);
TRACE_LOG1 ("process=%p", pi.hProcess);
/* We don't need to wait for the process. */
if (!CloseHandle (pi.hProcess))
TRACE_LOG1 ("CloseHandle of process failed: ec=%d",
(int) GetLastError ());
close_handle (pi.hProcess);
if (! (flags & IOSPAWN_FLAG_NOCLOSE))
{
@ -1704,7 +1725,7 @@ _gpgme_io_select (struct io_select_fd_s *fds, size_t nfds, int nonblock)
any = 0;
for (i = code - WAIT_OBJECT_0; i < nwait; i++)
{
if (WaitForSingleObject (waitbuf[i], 0) == WAIT_OBJECT_0)
if (wait_for_single_object (waitbuf[i], 0) == WAIT_OBJECT_0)
{
assert (waitidx[i] >=0 && waitidx[i] < nfds);
fds[waitidx[i]].signaled = 1;