From 9ec2cbb1c2f2917a9b9e149def8da8c072134524 Mon Sep 17 00:00:00 2001 From: Guy Harris Date: Mon, 16 Nov 2015 11:49:35 -0800 Subject: Catch failure of _open_osfhandle(). This may at least prevent the crash in bug 11702, by not returning "success" with bogus file handles of -1, if the opens fail due to leaks chewing up all the available slots. More investigation needs to be done to see why we're leaking. Change-Id: I89ecff4b03bca140f05c838e1e2604a03409f803 Ping-Bug: 11702 Reviewed-on: https://code.wireshark.org/review/11881 Petri-Dish: Guy Harris Tested-by: Petri Dish Buildbot Reviewed-by: Guy Harris --- capchild/capture_sync.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'capchild/capture_sync.c') diff --git a/capchild/capture_sync.c b/capchild/capture_sync.c index 460b790099..97777c6399 100644 --- a/capchild/capture_sync.c +++ b/capchild/capture_sync.c @@ -873,7 +873,31 @@ sync_pipe_open_command(char** argv, int *data_read_fd, /* associate the operating system filehandles to C run-time file handles */ /* (good file handle infos at: http://www.flounder.com/handles.htm) */ *data_read_fd = _open_osfhandle( (intptr_t) data_pipe[PIPE_READ], _O_BINARY); + if (*data_read_fd == -1) { + *msg = g_strdup_printf("Couldn't get C file handle for data read pipe: %s", g_strerror(errno)); + CloseHandle(data_pipe[PIPE_READ]); + CloseHandle(data_pipe[PIPE_WRITE]); + CloseHandle(sync_pipe[PIPE_READ]); + CloseHandle(sync_pipe[PIPE_WRITE]); + for (i = 0; argv[i] != NULL; i++) { + g_free( (gpointer) argv[i]); + } + g_free( (gpointer) argv); + return -1; + } *message_read_fd = _open_osfhandle( (intptr_t) sync_pipe[PIPE_READ], _O_BINARY); + if (*message_read_fd == -1) { + *msg = g_strdup_printf("Couldn't get C file handle for message read pipe: %s", g_strerror(errno)); + ws_close(*data_read_fd); /* Should close data_pipe[PIPE_READ] */ + CloseHandle(data_pipe[PIPE_WRITE]); + CloseHandle(sync_pipe[PIPE_READ]); + CloseHandle(sync_pipe[PIPE_WRITE]); + for (i = 0; argv[i] != NULL; i++) { + g_free( (gpointer) argv[i]); + } + g_free( (gpointer) argv); + return -1; + } #else /* _WIN32 */ /* Create a pipe for the child process to send us messages */ if (pipe(sync_pipe) < 0) { -- cgit v1.2.3