Hi, In the following piece of AIX specific code from pcap-bpf.c that creates and configures the /dev/bpf*; I think a call to bpf_odmcleanup is required in the cases where either genmajor() or genminor() fail (see "FIX HERE" below). Otherwise, the bpf_load() function returns without unlocking the ODM lock acquired in bpf_odminit().
static int bpf_load(char *errbuf) { long major; int *minors; int numminors, i, rc; char dummy_err[PCAP_ERRBUF_SIZE]; /* FIX HERE */ char buf[1024]; struct stat sbuf; struct bpf_config cfg_bpf; struct cfg_load cfg_ld; struct cfg_kmod cfg_km; /* * This is very very close to what happens in the real implementation * but I've fixed some (unlikely) bug situations. */ if (bpfloadedflag) return (0); if (bpf_odminit(errbuf) == PCAP_ERROR) return (PCAP_ERROR); major = genmajor(BPF_NAME); if (major == -1) { snprintf(errbuf, PCAP_ERRBUF_SIZE, "bpf_load: genmajor failed: %s", pcap_strerror(errno)); (void)bpf_odmcleanup(dummy_err); /* FIX HERE */ return (PCAP_ERROR); } minors = getminor(major, &numminors, BPF_NAME); if (!minors) { minors = genminor("bpf", major, 0, BPF_MINORS, 1, 1); if (!minors) { snprintf(errbuf, PCAP_ERRBUF_SIZE, "bpf_load: genminor failed: %s", pcap_strerror(errno)); (void)bpf_odmcleanup(dummy_err); /* FIX HERE */ return (PCAP_ERROR); } } ... Also, in function bpf_odminit(), I believe that a call to odm_terminate() is also needed in the case where odm_lock() fails. That is: ... if ((odmlockid = odm_lock("/etc/objrepos/config_lock", ODM_WAIT)) == -1) { if (odm_err_msg(odmerrno, &errstr) == -1) errstr = "Unknown error"; snprintf(errbuf, PCAP_ERRBUF_SIZE, "bpf_load: odm_lock of /etc/objrepos/config_lock failed: %s", errstr); (void)odm_terminate(); /* FIX HERE */ return (PCAP_ERROR); } ... Am I right? Hope this help. Best regards, J-L Charton - This is the tcpdump-workers list. Visit https://cod.sandelman.ca/ to unsubscribe.