diff options
author | brooks <brooks@FreeBSD.org> | 2005-07-28 15:30:19 +0000 |
---|---|---|
committer | brooks <brooks@FreeBSD.org> | 2005-07-28 15:30:19 +0000 |
commit | f45086ab80bbd9df4f5b847c68b57c4b055ddb0d (patch) | |
tree | 9a94873b1ec8a631c8f52b7763c13eab1dbde385 /sbin | |
parent | 0336212d3405ba3060201ff384db19d4ef5ee59a (diff) | |
download | FreeBSD-src-f45086ab80bbd9df4f5b847c68b57c4b055ddb0d.zip FreeBSD-src-f45086ab80bbd9df4f5b847c68b57c4b055ddb0d.tar.gz |
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
Diffstat (limited to 'sbin')
-rw-r--r-- | sbin/dhclient/bpf.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/sbin/dhclient/bpf.c b/sbin/dhclient/bpf.c index abda36e..911acb4 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); |