Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 23 Jun 97 13:19:48 +0100
From:      Ian Stephenson <ians@cam-ani.co.uk>
To:        freebsd-hackers@FreeBSD.ORG
Subject:   BPF bug 
Message-ID:  <199706231219.NAA04824@louie.cam-ani.co.uk>

next in thread | raw e-mail | index | archive | help
In FreeBSD-current/src/sys/net/bpf.c

static void
catchpacket(d, pkt, pktlen, snaplen, cpfn)
	register struct bpf_d *d;
	register u_char *pkt;
	register u_int pktlen, snaplen;
	register void (*cpfn)(const void *, void *, u_int);
{
	register struct bpf_hdr *hp;
	register int totlen, curlen;
	register int hdrlen = d->bd_bif->bif_hdrlen;
	/*
	 * Figure out how many bytes to move.  If the packet is
	 * greater or equal to the snapshot length, transfer that
	 * much.  Otherwise, transfer the whole packet (unless
	 * we hit the buffer size limit).
	 */
	totlen = hdrlen + min(snaplen, pktlen);
...
}

appears to be doing a signed comparison of insigned ints.

This definately crashes in 2.1.6 (I can't upgrade yet, so can't  
verify this is still a problem) when snaplen = 0xffffffff.

replacing
		totlen = hdrlen + min(snaplen, pktlen);
with
	if(snaplen < pktlen)
		totlen = hdrlen + snaplen;
	else
		totlen = hdrlen + pktlen;
fixes the problem for me...

$an



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199706231219.NAA04824>