diff --git a/Makefile.nmake b/Makefile.nmake index 7022520aaf..8c681ac33a 100644 --- a/Makefile.nmake +++ b/Makefile.nmake @@ -205,6 +205,7 @@ config.h : config.h.win32 config.nmake -e "s/@HAVE_PCAP_FINDALLDEVS@/$(PCAP_FINDALLDEVS_CONFIG)/" \ -e "s/@HAVE_PCAP_DATALINK_NAME_TO_VAL@/$(PCAP_DATALINK_NAME_TO_VAL_CONFIG)/" \ -e "s/@HAVE_PCAP_DATALINK_VAL_TO_NAME@/$(PCAP_DATALINK_VAL_TO_NAME_CONFIG)/" \ + -e "s/@HAVE_PCAP_LIB_VERSION@/$(PCAP_LIB_VERSION_CONFIG)/" \ -e "s/@HAVE_LIBETHEREALDLL@/$(LIBETHEREAL_CONFIG)/" \ -e "s/@WPCAP_CONSTIFIED@/$(WPCAP_CONSTIFIED_CONFIG)/" \ < config.h.win32 > $@ diff --git a/acinclude.m4 b/acinclude.m4 index b29eabb588..334c13d7c9 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -419,7 +419,7 @@ and did you also install that package?]])) else AC_MSG_RESULT(no) fi - AC_CHECK_FUNCS(pcap_open_dead) + AC_CHECK_FUNCS(pcap_open_dead pcap_freecode) # # Later versions of Mac OS X 10.3[.x] ship a pcap.h that # doesn't define pcap_if_t but ship an 0.8[.x] libpcap, diff --git a/capture-wpcap.c b/capture-wpcap.c index 7d88073e69..9163b2997d 100644 --- a/capture-wpcap.c +++ b/capture-wpcap.c @@ -65,6 +65,7 @@ static int (*p_pcap_lookupnet) (char *, bpf_u_int32 *, bpf_u_int32 *, static pcap_t* (*p_pcap_open_live) (char *, int, int, int, char *); #endif static int (*p_pcap_loop) (pcap_t *, int, pcap_handler, guchar *); +static void (*p_pcap_freecode) (struct bpf_program *); #ifdef HAVE_PCAP_FINDALLDEVS static int (*p_pcap_findalldevs) (pcap_if_t **, char *); static void (*p_pcap_freealldevs) (pcap_if_t *); @@ -75,7 +76,9 @@ static int (*p_pcap_datalink_name_to_val) (const char *); #ifdef HAVE_PCAP_DATALINK_VAL_TO_NAME static const char *(*p_pcap_datalink_val_to_name) (int); #endif +#ifdef HAVE_PCAP_LIB_VERSION static const char *(*p_pcap_lib_version) (void); +#endif static int (*p_pcap_setbuff) (pcap_t *, int dim); typedef struct { @@ -104,6 +107,7 @@ load_wpcap(void) SYM(pcap_lookupnet, FALSE), SYM(pcap_open_live, FALSE), SYM(pcap_loop, FALSE), + SYM(pcap_freecode, FALSE), #ifdef HAVE_PCAP_FINDALLDEVS SYM(pcap_findalldevs, TRUE), SYM(pcap_freealldevs, TRUE), @@ -114,7 +118,9 @@ load_wpcap(void) #ifdef HAVE_PCAP_DATALINK_VAL_TO_NAME SYM(pcap_datalink_val_to_name, TRUE), #endif +#ifdef HAVE_PCAP_LIB_VERSION SYM(pcap_lib_version, TRUE), +#endif SYM(pcap_setbuff, TRUE), { NULL, NULL, FALSE } }; @@ -179,7 +185,6 @@ pcap_dispatch(pcap_t *a, int b, pcap_handler c, guchar *d) return p_pcap_dispatch(a, b, c, d); } - int pcap_snapshot(pcap_t *a) { @@ -187,7 +192,6 @@ pcap_snapshot(pcap_t *a) return p_pcap_snapshot(a); } - int pcap_datalink(pcap_t *a) { @@ -246,6 +250,13 @@ pcap_loop(pcap_t *a, int b, pcap_handler c, guchar *d) return p_pcap_loop(a, b, c, d); } +void +pcap_freecode(struct bpf_program *a) +{ + g_assert(has_wpcap); + p_pcap_freecode(a); +} + #ifdef HAVE_PCAP_FINDALLDEVS int pcap_findalldevs(pcap_if_t **a, char *b) @@ -621,9 +632,12 @@ get_runtime_pcap_version(GString *str) } g_string_sprintfa(str, "with "); +#ifdef HAVE_PCAP_LIB_VERSION if (p_pcap_lib_version != NULL) g_string_sprintfa(str, p_pcap_lib_version()); - else if (packetVer != NULL) + else +#endif + if (packetVer != NULL) g_string_sprintfa(str, "WinPcap (%s)", packetVer); else g_string_append(str, "WinPcap (version unknown)"); diff --git a/capture_loop.c b/capture_loop.c index 88fe54241b..1f947fa6f1 100644 --- a/capture_loop.c +++ b/capture_loop.c @@ -764,8 +764,14 @@ static int capture_loop_init_filter(loop_data *ld, const gchar * iface, gchar * if (pcap_setfilter(ld->pcap_h, &fcode) < 0) { g_snprintf(errmsg, errmsg_len, "Can't install filter (%s).", pcap_geterr(ld->pcap_h)); +#ifdef HAVE_PCAP_FREECODE + pcap_freecode(&fcode); +#endif return FALSE; } +#ifdef HAVE_PCAP_FREECODE + pcap_freecode(&fcode); +#endif } return TRUE; diff --git a/config.nmake b/config.nmake index 865e747528..59ee1b1a33 100644 --- a/config.nmake +++ b/config.nmake @@ -284,11 +284,17 @@ PCAP_FINDALLDEVS_CONFIG= PCAP_DATALINK_VAL_TO_NAME_CONFIG= WPCAP_CONSTIFIED= !ENDIF +!IF "$(WINPCAP_VERSION)" == "3.1" +PCAP_LIB_VERSION_CONFIG=^#define HAVE_PCAP_LIB_VERSION 1 +!ELSE +PCAP_LIB_VERSION_CONFIG= +!ENDIF !ELSE WINPCAP_CONFIG= PCAP_FINDALLDEVS_CONFIG= PCAP_DATALINK_NAME_TO_VAL_CONFIG= PCAP_DATALINK_VAL_TO_NAME_CONFIG= +PCAP_LIB_VERSION_CONFIG= WPCAP_CONSTIFIED= !ENDIF diff --git a/tethereal.c b/tethereal.c index ef6e5cd2af..1bdf2e48e3 100644 --- a/tethereal.c +++ b/tethereal.c @@ -1651,8 +1651,14 @@ capture(char *save_file, int out_file_type) if (pcap_setfilter(ld.pch, &fcode) < 0) { snprintf(errmsg, sizeof errmsg, "Can't install filter (%s).", pcap_geterr(ld.pch)); +#ifdef HAVE_PCAP_FREECODE + pcap_freecode(&fcode); +#endif goto error; } +#ifdef HAVE_PCAP_FREECODE + pcap_freecode(&fcode); +#endif } /* Set up to write to the capture file. */