Package: libpcap0.8
Severity: normal
Tags: patch

Hi,

The attached quilt patch makes pcap_loop() abort if poll() indicates
an error occurred. This avoids it busy-looping when an interface goes
down during polling...

I'm not sure whether this patch should be applied as-is, because it
means pcap_loop() exits where it wouldn't before. I haven't checked
all libpcap's reverse dependencies to determine whether any would be
affected beyond arpwatch; I do know the latter would be, since it
simply exits when pcap_loop() returns. My first pass through the other
reverse dependencies seems to suggest this is a common reaction; I
don't know whether it's bad though, since exiting may be the
appropriate way of handling an interface's disappearance.

If necessary I can discuss this upstream...

Regards,

Stephen

-- System Information:
Debian Release: squeeze/sid
  APT prefers testing
  APT policy: (500, 'testing'), (500, 'stable'), (200, 'unstable'), (1, 
'experimental')
Architecture: i386 (i686)

Kernel: Linux 2.6.30-2-686 (SMP w/2 CPU cores)
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages libpcap0.8 depends on:
ii  libc6                         2.9-25     GNU C Library: Shared libraries

libpcap0.8 recommends no packages.

libpcap0.8 suggests no packages.

-- no debconf information
poll() can also indicate errors on the items being polled by setting
the POLLERR bit in the returned events, without poll() itself
returning an error code. This patch makes pcap_loop() abort when this
happens.

--- libpcap-1.0.0.orig/pcap-linux.c
+++ libpcap-1.0.0/pcap-linux.c
@@ -2193,7 +2193,7 @@
                        /* poll() requires a negative timeout to wait forever */
                        ret = poll(&pollinfo, 1, (handle->md.timeout > 0)?
                                                handle->md.timeout: -1);
-                       if ((ret < 0) && (errno != EINTR)) {
+                       if (((ret < 0) || (pollinfo.revents & POLLERR)) && 
(errno != EINTR)) {
                                snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, 
                                         "can't poll on packet socket fd %d: 
%d-%s",
                                        handle->fd, errno, 
pcap_strerror(errno));

Reply via email to