From: Guy Harris Date: Sun, 21 Jan 2018 18:21:18 +0000 (-0800) Subject: Free the socket temporary when appropriate. X-Git-Tag: libpcap-1.9-bp~279 X-Git-Url: https://git.tcpdump.org/libpcap/commitdiff_plain/83bd60614e0a6445c1be5549f1728347684cd889 Free the socket temporary when appropriate. If we're using threads, free it if the attempt to create the thread fails. If we're using subprocesses, free it in the parent process, which isn't using it. (We don't really teed the socket temporary if we're using subprocesses, as the socket value won't be overwritten - the multiple socket opens are done in separate processes.) This should fix Coverity CID 1418994. --- diff --git a/rpcapd/rpcapd.c b/rpcapd/rpcapd.c index cb5d4a0c..6699aa0f 100755 --- a/rpcapd/rpcapd.c +++ b/rpcapd/rpcapd.c @@ -388,9 +388,23 @@ void main_startup(void) continue; } - // This trick is needed in order to allow the child thread to save the 'sockmain' variable - // withouth getting it overwritten by the sock_open, in case we want to open more than one waiting sockets - // For instance, the rpcapd_thread_create() will accept the socktemp variable, and it will deallocate immediately that variable + // + // This trick is needed in order to allow the child + // thread to save the 'sockmain' variable without + // getting it overwritten by the sock_open, in case + // we want to open more than one waiting socket. + // + // For instance, the rpcapd_thread_create() will + // accept the socktemp variable, and it will + // immediately deallocate that variable. + // + // XXX - this shouldn't be necessary if we're + // using subprocesses rather than threads, as + // the use and overwrite would be done in + // separate processes; we should be able to + // pass a pointer to sockmain in the child + // process. + // socktemp = (SOCKET *) malloc (sizeof (SOCKET)); if (socktemp == NULL) exit(0); @@ -403,6 +417,7 @@ void main_startup(void) if (threadId == 0) { SOCK_ASSERT("Error creating the passive child thread", 1); + free(socktemp); continue; } CloseHandle(threadId); @@ -413,6 +428,7 @@ void main_startup(void) main_passive((void *) socktemp); return; } + free(socktemp); #endif tempaddrinfo = tempaddrinfo->ai_next; }