Win32: Try to fix handle leaks in capture_sync.
authorGerald Combs <gerald@wireshark.org>
Mon, 16 Nov 2015 19:47:36 +0000 (11:47 -0800)
committerAnders Broman <a.broman58@gmail.com>
Tue, 17 Nov 2015 08:19:44 +0000 (08:19 +0000)
If CreateProcess succeeds, close our child's primary thread handle. As
the PROCESS_INFORMATION page at
https://msdn.microsoft.com/en-us/library/windows/desktop/ms684873.aspx
says,

    If the function succeeds, be sure to call the CloseHandle function
    to close the hProcess and hThread handles when you are finished with
    them. Otherwise, when the child process exits, the system cannot
    clean up the process structures for the child process because the
    parent process still has open handles to the child process.

Closing the handle immediately doesn't seem to do any harm here, but
add a note that we might want to store it and close it later.

In sync_interface_stats_open, close our message and data descriptors
after calling sync_pipe_wait_for_child.

Ping-Bug: 11702
Change-Id: I56e0625fdceb66fba822c2dc83e07d40844329a7
Reviewed-on: https://code.wireshark.org/review/11882
Petri-Dish: Gerald Combs <gerald@wireshark.org>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Gerald Combs <gerald@wireshark.org>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
capchild/capture_sync.c

index 8273ee6dacf4eb8a9652a4b8ae5d4bb8654fe449..81344be45098fc690fa7724d5a23bfc884d250ff 100644 (file)
@@ -697,6 +697,8 @@ sync_pipe_start(capture_options *capture_opts, capture_session *cap_session, voi
         return FALSE;
     }
     cap_session->fork_child = pi.hProcess;
+    /* We may need to store this and close it later */
+    CloseHandle(pi.hThread);
     g_string_free(args, TRUE);
 
     cap_session->signal_pipe_write_fd = signal_pipe_write_fd;
@@ -948,6 +950,8 @@ sync_pipe_open_command(char** argv, int *data_read_fd,
         return -1;
     }
     *fork_child = pi.hProcess;
+    /* We may need to store this and close it later */
+    CloseHandle(pi.hThread);
     g_string_free(args, TRUE);
 #else /* _WIN32 */
     /* Create a pipe for the child process to send us messages */
@@ -1495,6 +1499,8 @@ sync_interface_stats_open(int *data_read_fd, ws_process_id *fork_child, gchar **
            case, the child will get an error when writing to the broken pipe
            the next time, cleaning itself up then. */
         ret = sync_pipe_wait_for_child(*fork_child, &wait_msg);
+        ws_close(message_read_fd);
+        ws_close(*data_read_fd);
         if(nread == 0) {
             /* We got an EOF from the sync pipe.  That means that it exited
                before giving us any data to read.  If ret is -1, we report