From 064be8949c53e43ba56a586d30d2186e5da8cb06 Mon Sep 17 00:00:00 2001<br>From: Jianqiu Zhang <zhangjianqiu_133@yeah.net><br>Date: Tue, 5 Jan 2016 09:12:42 +0800<br>Subject: [PATCH 2/2] wpcap: Fix crash on pcap_loop<br><br>Signed-off-by: Jianqiu Zhang <zhangjianqiu_133@yeah.net><br>---<br> dlls/wpcap/wpcap.c | 11 ++++++++---<br> 1 file changed, 8 insertions(+), 3 deletions(-)<br><br>diff --git a/dlls/wpcap/wpcap.c b/dlls/wpcap/wpcap.c<br>index da911c7..0c725a4 100644<br>--- a/dlls/wpcap/wpcap.c<br>+++ b/dlls/wpcap/wpcap.c<br>@@ -95,7 +95,6 @@ static void pcap_handler_callback(u_char *user_data, const struct pcap_pkthdr *h<br>     TRACE("(%p %p %p)\n", user_data, h, p);<br>     pcb = (PCAP_HANDLER_CALLBACK *)user_data;<br>     pcb->pfn_cb(pcb->user_data, h, p);<br>-    HeapFree(GetProcessHeap(), 0, pcb);<br>     TRACE("Callback COMPLETED\n");<br> }<br> <br>@@ -103,6 +102,7 @@ int CDECL wine_pcap_dispatch(pcap_t *p, int cnt,<br>                              void (CALLBACK *callback)(u_char *, const struct pcap_pkthdr *, const u_char *),<br>                              unsigned char *user)<br> {<br>+    int res = 0;<br>     TRACE("(%p %i %p %p)\n", p, cnt, callback, user);<br> <br>     if (callback)<br>@@ -111,7 +111,9 @@ int CDECL wine_pcap_dispatch(pcap_t *p, int cnt,<br>         pcb = HeapAlloc(GetProcessHeap(), 0, sizeof(PCAP_HANDLER_CALLBACK));<br>         pcb->pfn_cb = callback;<br>         pcb->user_data = user;<br>-        return pcap_dispatch(p, cnt, pcap_handler_callback, (unsigned char*)pcb);<br>+        res = pcap_dispatch(p, cnt, pcap_handler_callback, (unsigned char *)pcb);<br>+        HeapFree(GetProcessHeap(), 0, pcb);<br>+        return res;<br>     }<br> <br>     return pcap_dispatch(p, cnt, NULL, user);<br>@@ -196,6 +198,7 @@ int CDECL wine_pcap_loop(pcap_t *p, int cnt,<br>                          void (CALLBACK *callback)(u_char *, const struct pcap_pkthdr *, const u_char *),<br>                          unsigned char *user)<br> {<br>+    int res = 0;<br>     TRACE("(%p %i %p %p)\n", p, cnt, callback, user);<br> <br>     if (callback)<br>@@ -204,7 +207,9 @@ int CDECL wine_pcap_loop(pcap_t *p, int cnt,<br>         pcb = HeapAlloc(GetProcessHeap(), 0, sizeof(PCAP_HANDLER_CALLBACK));<br>         pcb->pfn_cb = callback;<br>         pcb->user_data = user;<br>-        return pcap_loop(p, cnt, pcap_handler_callback, (unsigned char*)pcb);<br>+        res =  pcap_loop(p, cnt, pcap_handler_callback, (unsigned char *)pcb);<br>+        HeapFree(GetProcessHeap(), 0, pcb);<br>+        return res;<br>     }<br> <br>     return pcap_loop(p, cnt, NULL, user);<br>-- <br>2.6.4<br>