Re: malloc bugs with tcpdump

From: Sam Leffler <sam_at_errno.com>
Date: Mon, 16 Jan 2006 09:30:06 -0800
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

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
_at__at_ -746,7 +746,7 _at__at_
 		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));
Received on Mon Jan 16 2006 - 16:28:32 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:38:50 UTC