diff options
author | brooks <brooks@FreeBSD.org> | 2006-09-26 01:02:02 +0000 |
---|---|---|
committer | brooks <brooks@FreeBSD.org> | 2006-09-26 01:02:02 +0000 |
commit | a0d200f631291252561f016e34c47c970542ad7a (patch) | |
tree | 8cc77d01c18a1ee953f94c1fc1973ef6724c4194 /sbin/dhclient/bpf.c | |
parent | aa39d5a21d65d0824205e5e5a3ab9e2a8138baa3 (diff) | |
download | FreeBSD-src-a0d200f631291252561f016e34c47c970542ad7a.zip FreeBSD-src-a0d200f631291252561f016e34c47c970542ad7a.tar.gz |
It is possible for bpf to return a length such that:
length != BPF_WORDALIGN(length)
This meeans that it is possible for this to be true:
interface->rbuf_offset > interface->rbuf_len
Handle this case in the test for running out of packets. While
OpenBSD's solution of setting interface->rbuf_len to
BPF_WORDALIGN(length) is safe due to the size of the buffer, I think
this solution results in less hidden assumptions.
This should fix the problem of dhclient running away and consuming 100%
CPU.
PR: bin/102226
Submitted by: Joost Bekkers <joost at jodocus.org>
MFC after: 3 days
Diffstat (limited to 'sbin/dhclient/bpf.c')
-rw-r--r-- | sbin/dhclient/bpf.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/sbin/dhclient/bpf.c b/sbin/dhclient/bpf.c index 785db21..43122fb 100644 --- a/sbin/dhclient/bpf.c +++ b/sbin/dhclient/bpf.c @@ -282,7 +282,7 @@ receive_packet(struct interface_info *interface, unsigned char *buf, */ do { /* If the buffer is empty, fill it. */ - if (interface->rbuf_offset == interface->rbuf_len) { + if (interface->rbuf_offset >= interface->rbuf_len) { length = read(interface->rfdesc, interface->rbuf, interface->rbuf_max); if (length <= 0) |