diff options
author | Chris Maynard <Christopher.Maynard@GTECH.COM> | 2012-06-09 03:36:15 +0000 |
---|---|---|
committer | Chris Maynard <Christopher.Maynard@GTECH.COM> | 2012-06-09 03:36:15 +0000 |
commit | c3dadc73f3d2f9682fb8f3b2850e661bfb0b98d7 (patch) | |
tree | 5a10e5452b007d6ae828fcaaf7217661ebbe7d67 /dumpcap.c | |
parent | 1a7470c6be25e157d8323011acae47478bcdf1ab (diff) |
Fix Coverity CID 708961: Resource leak, by closing the socket if the connect() fails. While there, print a human-readable error message on Windows like we do for other platforms. Lastly, be sure to specify FORMAT_MESSAGE_IGNORE_INSERTS in the dwFlags arg to all FormatMessage() calls where FORMAT_MESSAGE_FROM_SYSTEM is also specified. (Ref: http://blogs.msdn.com/b/oldnewthing/archive/2007/11/28/6564257.aspx)
svn path=/trunk/; revision=43171
Diffstat (limited to 'dumpcap.c')
-rw-r--r-- | dumpcap.c | 32 |
1 files changed, 25 insertions, 7 deletions
@@ -155,6 +155,8 @@ static gboolean infoprint; /* if TRUE, print capture info after clearing in /** Stop a low-level capture (stops the capture child). */ static void capture_loop_stop(void); +/** Close a pipe, or socket if \a from_socket is TRUE */ +static void cap_pipe_close(int pipe_fd, gboolean from_socket _U_); #if !defined (__linux__) #ifndef HAVE_PCAP_BREAKLOOP @@ -1827,16 +1829,32 @@ cap_open_socket(char *pipename, pcap_options *pcap_opts, char *errmsg, int errms sa.sin_family = AF_INET; sa.sin_port = htons((u_short)port); - if (((fd = (int)socket(AF_INET, SOCK_STREAM, 0)) < 0) || + if (((fd = (int)socket(AF_INET, SOCK_STREAM, 0)) < 0) || (connect(fd, (struct sockaddr *)&sa, sizeof(sa)) < 0)) { +#ifdef _WIN32 + LPTSTR errorText = NULL; + int lastError; + + lastError = WSAGetLastError(); + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, lastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR)&errorText, 0, NULL); +#endif g_snprintf(errmsg, errmsgl, - "The capture session could not be initiated due to\n" + "The capture session could not be initiated due to the socket error: \n" #ifdef _WIN32 - "the socket error: %d", WSAGetLastError()); + " %d: %S", lastError, errorText ? (char *)errorText : "Unknown"); + if (errorText) + LocalFree(errorText); #else - "the socket error: %s", strerror(errno)); + " %d: %s", errno, strerror(errno)); #endif pcap_opts->cap_pipe_err = PIPERR; + + if (fd >= 0) + cap_pipe_close(fd, TRUE); return -1; } @@ -2030,7 +2048,7 @@ cap_pipe_open_live(char *pipename, break; if (GetLastError() != ERROR_PIPE_BUSY) { - FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), 0, (LPTSTR) &err_str, 0, NULL); g_snprintf(errmsg, errmsgl, "The capture session on \"%s\" could not be started " @@ -2042,7 +2060,7 @@ cap_pipe_open_live(char *pipename, } if (!WaitNamedPipe(utf_8to16(pipename), 30 * 1000)) { - FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), 0, (LPTSTR) &err_str, 0, NULL); g_snprintf(errmsg, errmsgl, "The capture session on \"%s\" timed out during " @@ -2417,7 +2435,7 @@ cap_pipe_dispatch(loop_data *ld, pcap_options *pcap_opts, guchar *data, char *er case PD_PIPE_ERR: #ifdef _WIN32 - FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), 0, (LPTSTR) &err_str, 0, NULL); g_snprintf(errmsg, errmsgl, "Error reading from pipe: %s (error %d)", |