libpcap/libpcap-1.5.2-filter-fix.patch
Marcus Meissner 6ef0670f31 Accepting request 222227 from home:vitezslav_cizek:branches:Base:System
- added support for netlink (bnc#863823)
  * libpcap-netlink.patch

- update to 1.5.3
  * Don't let packets that don't match the current filter get to the
    application when TPACKET_V3 is used. (GitHub issue #331)
  * Fix handling of pcap_loop()/pcap_dispatch() with a packet count
    of 0 on some platforms (including Linux with TPACKET_V3).
    (GitHub issue #333)
  * Work around TPACKET_V3 deficiency that causes packets to be lost
    when a timeout of 0 is specified. (GitHub issue #335)
  * Man page formatting fixes.
- refreshed libpcap-1.5.2-filter-fix.patch

OBS-URL: https://build.opensuse.org/request/show/222227
OBS-URL: https://build.opensuse.org/package/show/Base:System/libpcap?expand=0&rev=36
2014-02-15 10:08:40 +00:00

57 lines
1.8 KiB
Diff

---
pcap-bpf.c | 2 +-
pcap-linux.c | 22 ++++++++++++++++++++++
2 files changed, 23 insertions(+), 1 deletion(-)
Index: libpcap-1.5.3/pcap-bpf.c
===================================================================
--- libpcap-1.5.3.orig/pcap-bpf.c 2014-02-13 17:22:30.794295046 +0100
+++ libpcap-1.5.3/pcap-bpf.c 2014-02-13 17:22:31.667305231 +0100
@@ -494,7 +494,7 @@ bpf_open(pcap_t *p)
fd = open(device, O_RDWR);
if (fd == -1 && errno == EACCES)
fd = open(device, O_RDONLY);
- } while (fd < 0 && errno == EBUSY);
+ } while (fd < 0 && errno == EBUSY && n < 1000);
/*
* XXX better message for all minors used
Index: libpcap-1.5.3/pcap-linux.c
===================================================================
--- libpcap-1.5.3.orig/pcap-linux.c 2014-02-13 17:22:31.668305243 +0100
+++ libpcap-1.5.3/pcap-linux.c 2014-02-13 17:24:01.924357989 +0100
@@ -2476,11 +2476,33 @@ pcap_setfilter_linux_common(pcap_t *hand
if (can_filter_in_kernel) {
if ((err = set_kernel_filter(handle, &fcode)) == 0)
{
+ char buf[1024];
+ int oldflags;
+ int ret;
+ unsigned int received = 0, rec_len = 0;
+ socklen_t optlen = sizeof(rec_len);
/*
* Installation succeded - using kernel filter,
* so userland filtering not needed.
*/
handlep->filter_in_userland = 0;
+
+ oldflags = fcntl(handle->fd, F_GETFL, 0);
+ oldflags |= O_NONBLOCK;
+ fcntl(handle->fd, F_SETFL, oldflags);
+ getsockopt(handle->fd, SOL_SOCKET, SO_RCVBUF,
+ (char *)&rec_len, &optlen);
+
+ /* now read all packets received until now */
+ while((ret = read(handle->fd, buf, 1024)) > 0
+ && received < rec_len) {
+ received += ret;
+ }
+
+ if(oldflags > 0) {
+ oldflags &= ~O_NONBLOCK;
+ fcntl(handle->fd, F_SETFL, oldflags);
+ }
}
else if (err == -1) /* Non-fatal error */
{