From e3f66c52ec251bc8146631d2c32340a332c1ff0a Mon Sep 17 00:00:00 2001 From: Victor Julien Date: Wed, 23 May 2012 11:19:04 +0200 Subject: [PATCH] pcap: fix double free issue with bpf filter and multiple interfaces. --- src/source-pcap.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/source-pcap.c b/src/source-pcap.c index b8bd9c1a46..f5b354e7ae 100644 --- a/src/source-pcap.c +++ b/src/source-pcap.c @@ -65,6 +65,7 @@ typedef struct PcapThreadVars_ unsigned char pcap_state; /* thread specific bpf */ struct bpf_program filter; + /* ptr to string from config */ char *bpf_filter; /* data link type for the thread */ @@ -357,7 +358,13 @@ TmEcode ReceivePcapThreadInit(ThreadVars *tv, void *initdata, void **data) { char errbuf[PCAP_ERRBUF_SIZE]; ptv->pcap_handle = pcap_create((char *)pcapconfig->iface, errbuf); if (ptv->pcap_handle == NULL) { - SCLogError(SC_ERR_PCAP_CREATE, "Couldn't create a new pcap handler, error %s", pcap_geterr(ptv->pcap_handle)); + if (strlen(errbuf)) { + SCLogError(SC_ERR_PCAP_CREATE, "Couldn't create a new pcap handler for %s, error %s", + (char *)pcapconfig->iface, errbuf); + } else { + SCLogError(SC_ERR_PCAP_CREATE, "Couldn't create a new pcap handler for %s", + (char *)pcapconfig->iface); + } SCFree(ptv); pcapconfig->DerefFunc(pcapconfig); SCReturnInt(TM_ECODE_FAILED); @@ -421,9 +428,8 @@ TmEcode ReceivePcapThreadInit(ThreadVars *tv, void *initdata, void **data) { /* set bpf filter if we have one */ if (pcapconfig->bpf_filter) { - ptv->bpf_filter = SCStrdup(pcapconfig->bpf_filter); - /* free bpf as we are using a copy */ - SCFree(pcapconfig->bpf_filter); + ptv->bpf_filter = pcapconfig->bpf_filter; + if(pcap_compile(ptv->pcap_handle,&ptv->filter,ptv->bpf_filter,1,0) < 0) { SCLogError(SC_ERR_BPF,"bpf compilation error %s",pcap_geterr(ptv->pcap_handle)); SCFree(ptv); @@ -494,7 +500,7 @@ TmEcode ReceivePcapThreadInit(ThreadVars *tv, void *initdata, void **data) { /* set bpf filter if we have one */ if (pcapconfig->bpf_filter) { - ptv->bpf_filter = SCStrdup(pcapconfig->bpf_filter); + ptv->bpf_filter = pcapconfig->bpf_filter; SCLogInfo("using bpf-filter \"%s\"", ptv->bpf_filter); if(pcap_compile(ptv->pcap_handle,&ptv->filter, ptv->bpf_filter,1,0) < 0) { @@ -564,10 +570,6 @@ void ReceivePcapThreadExitStats(ThreadVars *tv, void *data) { TmEcode ReceivePcapThreadDeinit(ThreadVars *tv, void *data) { PcapThreadVars *ptv = (PcapThreadVars *)data; - if (ptv->bpf_filter) { - SCFree(ptv->bpf_filter); - ptv->bpf_filter = NULL; - } pcap_close(ptv->pcap_handle); SCReturnInt(TM_ECODE_OK); }