aboutsummaryrefslogtreecommitdiffstats
path: root/dumpcap.c
diff options
context:
space:
mode:
authorChris Maynard <Christopher.Maynard@GTECH.COM>2012-06-09 03:36:15 +0000
committerChris Maynard <Christopher.Maynard@GTECH.COM>2012-06-09 03:36:15 +0000
commitc3dadc73f3d2f9682fb8f3b2850e661bfb0b98d7 (patch)
tree5a10e5452b007d6ae828fcaaf7217661ebbe7d67 /dumpcap.c
parent1a7470c6be25e157d8323011acae47478bcdf1ab (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.c32
1 files changed, 25 insertions, 7 deletions
diff --git a/dumpcap.c b/dumpcap.c
index 9e75429a92..e4fe5d6d6e 100644
--- a/dumpcap.c
+++ b/dumpcap.c
@@ -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)",