malloc bugs with tcpdump
Sam Leffler
sam at errno.com
Mon Jan 16 09:28:33 PST 2006
Giorgos Keramidas wrote:
> On 2006-01-15 20:37, Kris Kennaway <kris at obsecurity.org> wrote:
>
>># tcpdump -i bge0 proto ipv6
>>tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
>>listening on bge0, link-type EN10MB (Ethernet), capture size 96 bytes
>>
>>^C
>>0 packets captured
>>2529 packets received by filter
>>0 packets dropped by kernel
>>tcpdump: (malloc) Corrupted redzone 1 byte after 0x8020002e0 (size 5) (0x0)
>>tcpdump: (malloc) Corrupted redzone 2 bytes after 0x8020002e0 (size 5) (0x0)
>>tcpdump: (malloc) Corrupted redzone 3 bytes after 0x8020002e0 (size 5) (0x0)
>>#
>
>
> I can repeat this even without the "proto ipv6" filter. The backtrace
> of tcpdump isn't very useful by the time abort() is called:
>
> (gdb) bt
> #0 0x0000000800ae687c in kill () at kill.S:2
> #1 0x0000000800ae570d in abort () at /home/build/src/lib/libc/stdlib/abort.c:69
> #2 0x0000000800a83e79 in idalloc (ptr=0x8020002e0) at /home/build/src/lib/libc/stdlib/malloc.c:3385
> #3 0x0000000800a8849b in free (ptr=0x8020002e0) at /home/build/src/lib/libc/stdlib/malloc.c:4728
> #4 0x00000008006c0505 in pcap_close (p=0x802000070) at /home/build/src/lib/libpcap/../../contrib/libpcap/pcap.c:785
> #5 0x0000000000445790 in main (argc=-6632, argv=0x444a50)
> at /home/build/src/usr.sbin/tcpdump/tcpdump/../../../contrib/tcpdump/tcpdump.c:1067
> (gdb)
>
> Is there any way to capture tcpdump within gdb while it's modifying the
> allocated area?
I sent the attached patch upstream to the tcpdump folks. Once I hear
back I'll commit it.
Sam
-------------- next part --------------
Index: pcap-bpf.c
===================================================================
RCS file: /usr/ncvs/src/contrib/libpcap/pcap-bpf.c,v
retrieving revision 1.1.1.10
diff -u -r1.1.1.10 pcap-bpf.c
--- pcap-bpf.c 11 Jul 2005 03:24:42 -0000 1.1.1.10
+++ pcap-bpf.c 16 Jan 2006 05:48:49 -0000
@@ -746,7 +746,7 @@
u_int i;
int is_ethernet;
- bdl.bfl_list = (u_int *) malloc(sizeof(u_int) * bdl.bfl_len + 1);
+ bdl.bfl_list = (u_int *) malloc(sizeof(u_int) * (bdl.bfl_len + 1));
if (bdl.bfl_list == NULL) {
(void)snprintf(ebuf, PCAP_ERRBUF_SIZE, "malloc: %s",
pcap_strerror(errno));
More information about the freebsd-current
mailing list