diff options
author | Ted Lemon <source@isc.org> | 2000-11-30 18:12:56 +0000 |
---|---|---|
committer | Ted Lemon <source@isc.org> | 2000-11-30 18:12:56 +0000 |
commit | eec641ca22647f95b51a4eb56411dc6fcd5fb3f5 (patch) | |
tree | 8d2be778c34d8f847dc4c8dc77e842db70203cd3 /common/bpf.c | |
parent | fa2dbe432de415276a0f22e5c38a03aa636915d6 (diff) | |
download | isc-dhcp-eec641ca22647f95b51a4eb56411dc6fcd5fb3f5.tar.gz |
Word-align BPF buffers.
Diffstat (limited to 'common/bpf.c')
-rw-r--r-- | common/bpf.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/common/bpf.c b/common/bpf.c index 6015bf17..edc889a1 100644 --- a/common/bpf.c +++ b/common/bpf.c @@ -47,7 +47,7 @@ #ifndef lint static char copyright[] = -"$Id: bpf.c,v 1.43 2000/10/10 22:00:09 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n"; +"$Id: bpf.c,v 1.44 2000/11/30 18:12:56 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n"; #endif /* not lint */ #include "dhcpd.h" @@ -452,8 +452,9 @@ ssize_t receive_packet (interface, buf, len, from, hfrom) the packet won't fit in the input buffer, all we can do is drop it. */ if (hdr.bh_caplen != hdr.bh_datalen) { - interface -> rbuf_offset += - hdr.bh_hdrlen = hdr.bh_caplen; + interface -> rbuf_offset = + BPF_WORDALIGN (interface -> rbuf_offset + + hdr.bh_hdrlen + hdr.bh_caplen); continue; } @@ -470,7 +471,9 @@ ssize_t receive_packet (interface, buf, len, from, hfrom) physical layer that supports this, but WTH), skip 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; @@ -486,24 +489,31 @@ ssize_t receive_packet (interface, buf, len, from, hfrom) /* 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; + interface -> rbuf_offset = + BPF_WORDALIGN (interface -> rbuf_offset + offset); hdr.bh_caplen -= offset; /* If there's not enough room to stash the packet data, we have to skip it (this shouldn't happen in real 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; |