aboutsummaryrefslogtreecommitdiff
path: root/sbin/dhclient/bpf.c
diff options
context:
space:
mode:
authorBrooks Davis <brooks@FreeBSD.org>2005-07-28 15:30:19 +0000
committerBrooks Davis <brooks@FreeBSD.org>2005-07-28 15:30:19 +0000
commit289d89d80f8229347fc52a6d0c390e9816e13971 (patch)
tree9a94873b1ec8a631c8f52b7763c13eab1dbde385 /sbin/dhclient/bpf.c
parent096dd4065fadec7de15e8ee5278b5c9fd05c5819 (diff)
downloadsrc-289d89d80f8229347fc52a6d0c390e9816e13971.tar.gz
src-289d89d80f8229347fc52a6d0c390e9816e13971.zip
Further fix receive_packet() by using BPF_WORDALIGN to insure the offset
is properly aligned when we move to the next packet. Obtained from: ISC dhclient via krw at OpenBSD
Notes
Notes: svn path=/head/; revision=148484
Diffstat (limited to 'sbin/dhclient/bpf.c')
-rw-r--r--sbin/dhclient/bpf.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/sbin/dhclient/bpf.c b/sbin/dhclient/bpf.c
index abda36e61e64..911acb49407f 100644
--- a/sbin/dhclient/bpf.c
+++ b/sbin/dhclient/bpf.c
@@ -325,7 +325,9 @@ receive_packet(struct interface_info *interface, unsigned char *buf,
* do is drop it.
*/
if (hdr.bh_caplen != hdr.bh_datalen) {
- interface->rbuf_offset += hdr.bh_caplen;
+ interface->rbuf_offset =
+ BPF_WORDALIGN(interface->rbuf_offset +
+ hdr.bh_caplen);
continue;
}
@@ -339,7 +341,9 @@ receive_packet(struct interface_info *interface, unsigned char *buf,
* this packet.
*/
if (offset < 0) {
- interface->rbuf_offset += hdr.bh_caplen;
+ interface->rbuf_offset =
+ BPF_WORDALIGN(interface->rbuf_offset +
+ hdr.bh_caplen);
continue;
}
interface->rbuf_offset += offset;
@@ -351,7 +355,9 @@ receive_packet(struct interface_info *interface, unsigned char *buf,
/* If the IP or UDP checksum was bad, skip the packet... */
if (offset < 0) {
- interface->rbuf_offset += hdr.bh_caplen;
+ interface->rbuf_offset =
+ BPF_WORDALIGN(interface->rbuf_offset +
+ hdr.bh_caplen);
continue;
}
interface->rbuf_offset += offset;
@@ -363,14 +369,18 @@ receive_packet(struct interface_info *interface, unsigned char *buf,
* life, though).
*/
if (hdr.bh_caplen > len) {
- interface->rbuf_offset += hdr.bh_caplen;
+ interface->rbuf_offset =
+ BPF_WORDALIGN(interface->rbuf_offset +
+ hdr.bh_caplen);
continue;
}
/* Copy out the data in the packet... */
memcpy(buf, interface->rbuf + interface->rbuf_offset,
hdr.bh_caplen);
- interface->rbuf_offset += hdr.bh_caplen;
+ interface->rbuf_offset =
+ BPF_WORDALIGN(interface->rbuf_offset +
+ hdr.bh_caplen);
return (hdr.bh_caplen);
} while (!length);
return (0);