From 5884e751bce0d63da531f5adb36216377d33a83c Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Sun, 30 Dec 2018 15:51:53 -0500 Subject: [PATCH] rawnet - close pcap if not an ethernet device. --- src/rawnet/rawnetarch_unix.c | 2 ++ src/rawnet/rawnetarch_win32.c | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/src/rawnet/rawnetarch_unix.c b/src/rawnet/rawnetarch_unix.c index a31c6d9..fb1541c 100644 --- a/src/rawnet/rawnetarch_unix.c +++ b/src/rawnet/rawnetarch_unix.c @@ -228,6 +228,8 @@ static int rawnet_pcap_open_adapter(const char *interface_name) /* Check the link layer. We support only Ethernet for simplicity. */ if (pcap_datalink(rawnet_pcap_fp) != DLT_EN10MB) { log_message(rawnet_arch_log, "ERROR: TFE works only on Ethernet networks."); + pcap_close(rawnet_pcap_fp); + rawnet_pcap_fp = NULL; return 0; } diff --git a/src/rawnet/rawnetarch_win32.c b/src/rawnet/rawnetarch_win32.c index 42426c0..741dbce 100644 --- a/src/rawnet/rawnetarch_win32.c +++ b/src/rawnet/rawnetarch_win32.c @@ -45,6 +45,7 @@ #include "rawnetsupp.h" typedef pcap_t *(*pcap_open_live_t)(const char *, int, int, int, char *); +typedef void *(*pcap_close_t)(pcap_if_t *); typedef int (*pcap_dispatch_t)(pcap_t *, int, pcap_handler, u_char *); typedef int (*pcap_setnonblock_t)(pcap_t *, int, char *); typedef int (*pcap_datalink_t)(pcap_t *); @@ -61,6 +62,7 @@ typedef char *(*pcap_lookupdev_t)(char *); #define RAWNET_DEBUG_WARN 1 /* this should not be deactivated */ static pcap_open_live_t p_pcap_open_live; +static pcap_close_t p_pcap_close; static pcap_dispatch_t p_pcap_dispatch; static pcap_setnonblock_t p_pcap_setnonblock; static pcap_findalldevs_t p_pcap_findalldevs; @@ -117,6 +119,7 @@ static void EthernetPcapFreeLibrary(void) pcap_library = NULL; p_pcap_open_live = NULL; + p_pcap_close = NULL; p_pcap_dispatch = NULL; p_pcap_setnonblock = NULL; p_pcap_findalldevs = NULL; @@ -161,6 +164,7 @@ static BOOL EthernetPcapLoadLibrary(void) } GET_PROC_ADDRESS_AND_TEST(pcap_open_live); + GET_PROC_ADDRESS_AND_TEST(pcap_close); GET_PROC_ADDRESS_AND_TEST(pcap_dispatch); GET_PROC_ADDRESS_AND_TEST(pcap_setnonblock); GET_PROC_ADDRESS_AND_TEST(pcap_findalldevs); @@ -288,6 +292,8 @@ static BOOL EthernetPcapOpenAdapter(const char *interface_name) if ((*p_pcap_datalink)(EthernetPcapFP) != DLT_EN10MB) { log_message(rawnet_arch_log, "ERROR: Ethernet works only on Ethernet networks."); rawnet_enumadapter_close(); + *(p_pcap_close(EthernetPcapFP)); + EthernetPcapFP = NULL; return FALSE; }