From: Guy Harris Date: Fri, 13 May 2011 07:24:42 +0000 (-0700) Subject: Handle kernels that don't support PACKET_RESERVE. X-Git-Tag: libpcap-1.2.1~56 X-Git-Url: https://git.tcpdump.org/libpcap/commitdiff_plain/c3e4329535c3de5b66c418d79f34ac9ea8eae1e2 Handle kernels that don't support PACKET_RESERVE. If, for some reason, the header files define PACKET_RESERVE but the kernel fails with ENOPROTOOPT if we use it in getsockopt(), treat it the same way we treat systems that don't define PACKET_RESERVE in the first place. One might argue that this "can't happen", but it apparently did happen in Debian bug 625443: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=625443 --- diff --git a/pcap-linux.c b/pcap-linux.c index a72aecdc..245c4859 100644 --- a/pcap-linux.c +++ b/pcap-linux.c @@ -3223,9 +3223,17 @@ create_ring(pcap_t *handle, int *status) #ifdef PACKET_RESERVE len = sizeof(tp_reserve); if (getsockopt(handle->fd, SOL_PACKET, PACKET_RESERVE, &tp_reserve, &len) < 0) { - snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "getsockopt: %s", pcap_strerror(errno)); - *status = PCAP_ERROR; - return -1; + if (errno != ENOPROTOOPT) { + /* + * ENOPROTOOPT means "kernel doesn't support + * PACKET_RESERVE", in which case we fall back + * as best we can. + */ + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "getsockopt: %s", pcap_strerror(errno)); + *status = PCAP_ERROR; + return -1; + } + tp_reserve = 0; /* older kernel, reserve not supported */ } #else tp_reserve = 0; /* older kernel, reserve not supported */