diff options
author | Gerald Combs <gerald@wireshark.org> | 2010-01-14 22:45:12 +0000 |
---|---|---|
committer | Gerald Combs <gerald@wireshark.org> | 2010-01-14 22:45:12 +0000 |
commit | 97c480741d8df17a43f24e01516ce6ae2a4dd97d (patch) | |
tree | 1b688dc6e70cd49a15651bc0d6da0585f3bacf9b /dumpcap.c | |
parent | b5924db6b834e33e1d8a7a2a59ab69ebcc872805 (diff) |
If we're using threads, time out when reading the file header.
svn path=/trunk/; revision=31529
Diffstat (limited to 'dumpcap.c')
-rw-r--r-- | dumpcap.c | 31 |
1 files changed, 26 insertions, 5 deletions
@@ -272,7 +272,7 @@ static int need_timeout_workaround; * Timeout, in microseconds, for threaded reads from a pipe. */ #define THREAD_READ_TIMEOUT 100 - +#define THREAD_OPEN_TIMEOUT (5 * 1000000) static char *cap_pipe_err_str; static void @@ -825,6 +825,10 @@ static void cap_pipe_open_live(char *pipename, struct pcap_hdr *hdr, loop_data *ld, char *errmsg, int errmsgl) { +#ifdef USE_THREADS + GTimeVal wait_time; + gpointer q_status; +#endif #ifndef _WIN32 struct stat pipe_stat; int sel_ret; @@ -982,8 +986,14 @@ cap_pipe_open_live(char *pipename, struct pcap_hdr *hdr, loop_data *ld, ld->cap_pipe_bytes_to_read = sizeof(magic); /* We don't have to worry about cap_pipe_read_mtx here */ g_async_queue_push(cap_pipe_pending_q, ld->cap_pipe_buf); - g_async_queue_pop(cap_pipe_done_q); - if (ld->cap_pipe_bytes_read <= 0) { + g_get_current_time(&wait_time); + g_time_val_add(&wait_time, THREAD_OPEN_TIMEOUT); + q_status = g_async_queue_timed_pop(cap_pipe_done_q, &wait_time); + if (!q_status) { + /* XXX - Are there more appropriate values we should use? */ + g_snprintf(errmsg, errmsgl, "Timeout on pipe magic during open"); + goto error; + } else if (ld->cap_pipe_bytes_read <= 0) { if (ld->cap_pipe_bytes_read == 0) g_snprintf(errmsg, errmsgl, "End of file on pipe magic during open"); else @@ -991,6 +1001,7 @@ cap_pipe_open_live(char *pipename, struct pcap_hdr *hdr, loop_data *ld, strerror(errno)); goto error; } + #endif /* USE_THREADS */ switch (magic) { @@ -1054,8 +1065,13 @@ cap_pipe_open_live(char *pipename, struct pcap_hdr *hdr, loop_data *ld, ld->cap_pipe_bytes_read = 0; ld->cap_pipe_bytes_to_read = sizeof(struct pcap_hdr); g_async_queue_push(cap_pipe_pending_q, ld->cap_pipe_buf); - g_async_queue_pop(cap_pipe_done_q); - if (ld->cap_pipe_bytes_read <= 0) { + g_get_current_time(&wait_time); + g_time_val_add(&wait_time, THREAD_OPEN_TIMEOUT); + q_status = g_async_queue_timed_pop(cap_pipe_done_q, &wait_time); + if (!q_status) { + g_snprintf(errmsg, errmsgl, "Timeout on pipe header during open"); + goto error; + } else if (ld->cap_pipe_bytes_read <= 0) { if (ld->cap_pipe_bytes_read == 0) g_snprintf(errmsg, errmsgl, "End of file on pipe header during open"); else @@ -1092,6 +1108,11 @@ error: #ifndef _WIN32 ws_close(fd); ld->cap_pipe_fd = -1; +#else + if (ld->cap_pipe_h != INVALID_HANDLE_VALUE) { + CloseHandle(ld->cap_pipe_h); + ld->cap_pipe_h = INVALID_HANDLE_VALUE; + } #endif return; |