On Mon, May 03, 2021 at 08:27:57AM -0600, Theo de Raadt wrote:
> Can you reproduce this, and capture core files?
Yes after a reboot I could reproduce it, I didn't even have to cycle the
interfaces. I got a coredump like you descriped for me. See below:
> Since our tcpdump is a privsep program, getting a core is a bit harder.
>
> mkdir /var/crash/tcpdump
> echo kern.nosuidcoredump=3 >> /etc/sysctl.conf
> reboot
>
> You could recompile tcpdump with -g or -ggdb, to gain better symbols.
>
> If you manage to create a coredump, run gdb against the unstripped
> binary (src/usr.sbin/tcpdump/obj/tcpdump) and let's see what the trace is.
Loaded symbols for /usr/libexec/ld.so
#0 0x00000032fd8d2f74 in wg_print () from /usr/sbin/tcpdump
(gdb) bt
#0 0x00000032fd8d2f74 in wg_print () from /usr/sbin/tcpdump
#1 0x00000032fd891880 in udp_print () from /usr/sbin/tcpdump
#2 0x00000032fd88d5f8 in ip_print () from /usr/sbin/tcpdump
#3 0x00000032fd88c4f8 in ether_encap_print () from /usr/sbin/tcpdump
#4 0x00000032fd88bf10 in ether_tryprint () from /usr/sbin/tcpdump
#5 0x00000032fd88bcc4 in ether_if_print () from /usr/sbin/tcpdump
#6 0x0000003766337f98 in pcap_read (p=0x37aa410e00, cnt=-1,
callback=0x32fd88bc40 <ether_if_print>, user=0x0)
at /usr/src/lib/libpcap/pcap-bpf.c:188
#7 0x00000037663359d4 in pcap_loop (p=0x37aa410e00, cnt=-1,
callback=0x32fd88bc40 <ether_if_print>, user=0x0)
at /usr/src/lib/libpcap/pcap.c:76
#8 0x00000032fd8818e8 in main () from /usr/sbin/tcpdump
It looks like it's in wg_print() I looked at this, but was unable to find
a solution. Perhaps memcpy'ing bp in wg_print() to another aligned buffer
and then trying to get the values out of it. I spent days fixing my programs
on octeon similar to that, but I used an unpack8, unpack16, unpack32, unpack64
and unpack() to do so, which in the latter case memcpy'd. I know too little
though of how tcpdump is best worked with, just writing memcpy's in there is
probably not a good idea.
Best Regards,
-peter