From 371a2cf7e0ea4058405dc97c0c2af94efe474e83 Mon Sep 17 00:00:00 2001 From: chengweiguo Date: Fri, 1 Aug 2025 14:19:29 -0700 Subject: [PATCH] fix race condition when add bpf socket Signed-off-by: chengweiguo --- src/Linux/mod_pcap.c | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/src/Linux/mod_pcap.c b/src/Linux/mod_pcap.c index 55964c6..ad0d0e9 100644 --- a/src/Linux/mod_pcap.c +++ b/src/Linux/mod_pcap.c @@ -414,12 +414,6 @@ extern "C" { static void tap_close(EVMod *mod, BPFSoc *bpfs) { bpfs->adaptor = NULL; - if(bpfs->sock > 0) { - // The fd socket belongs to pcap, not to EVSocket. We - // can tell EVSocketClose not to touch it but this way - // is more ostentatious. - bpfs->sock->fd = -1; - } if(bpfs->pcap) { pcap_close(bpfs->pcap); bpfs->pcap = NULL; @@ -436,18 +430,19 @@ extern "C" { -----------------___________________________------------------ */ static bool addBPFSocket(EVMod *mod, HSPPcap *pcap, SFLAdaptor *adaptor) { - HSP_mod_PCAP *mdata = (HSP_mod_PCAP *)mod->data; - BPFSoc search = { .deviceName = adaptor->deviceName }; - if(UTHashGet(mdata->bpf_socs, &search)) { - EVDebug(mod, 1, "sampling already configured for device=%s", adaptor->deviceName); - return NO; + HSP_mod_PCAP *mdata = (HSP_mod_PCAP *) mod->data; + BPFSoc *bpfs = (BPFSoc *) my_calloc(sizeof(BPFSoc)); + setStr(&bpfs->deviceName, adaptor->deviceName); + if (UTHashGetOrAdd(mdata->bpf_socs, bpfs)) { + EVDebug(mod, 1, "sampling already configured for device=%s", adaptor->deviceName); + if (bpfs->deviceName) + my_free(bpfs->deviceName); + my_free(bpfs); + return NO; } EVDebug(mod, 1, "addBPFSocket(%s) speed=%"PRIu64, adaptor->deviceName, adaptor->ifSpeed); - BPFSoc *bpfs = (BPFSoc *)my_calloc(sizeof(BPFSoc)); - UTHashAdd(mdata->bpf_socs, bpfs); bpfs->module = mod; bpfs->adaptor = adaptor; - setStr(&bpfs->deviceName, adaptor->deviceName); bpfs->promisc = pcap->promisc; bpfs->vport = pcap->vport; bpfs->vport_set = pcap->vport_set;