Skip to content

dhcpcd crashes with a bus error during startup on sparc64 #430

@koachan

Description

@koachan

Sample log:

# dhcpcd -dB enp12s0f0
main: control_open: Connection refused
dhcpcd-10.1.0 starting
DUID 00:01:00:01:2e:02:4d:64:00:10:e0:3a:79:4c
enp12s0f0: executing: /lib/dhcpcd/dhcpcd-run-hooks PREINIT
enp12s0f0: executing: /lib/dhcpcd/dhcpcd-run-hooks CARRIER
enp12s0f0: IAID e0:3a:79:4c
enp12s0f0: delaying IPv6 router solicitation for 0.4 seconds
enp12s0f0: delaying IPv4 for 1.2 seconds
enp12s0f0: soliciting an IPv6 router
enp12s0f0: sending Router Solicitation
enp12s0f0: reading lease: /var/lib/dhcpcd/enp12s0f0.lease
enp12s0f0: rebinding lease of 192.168.2.2
enp12s0f0: sending REQUEST (xid 0x6c5949ec), next in 4.0 seconds
Bus error

GDB backtrace:

dhcp_packet (ifp=0x1000021d5f0, data=0x7feffffc31a "E\020\001H", len=328, bpf_flags=1) at dhcp.c:3582
3582            if (!checksums_valid(data, &from, bpf_flags)) 

#0  dhcp_packet (ifp=0x1000021d5f0, data=0x7feffffc31a "E\020\001H", len=328, bpf_flags=1) at dhcp.c:3582
#1  0x00000100000355fc in dhcp_readbpf (arg=0x1000021d5f0, events=<optimized out>) at dhcp.c:3621
#2  0x000001000001712c in eloop_run_ppoll (eloop=0x1000021c690, ts=<optimized out>, signals=0x7feffffeb90) at eloop.c:1106
#3  eloop_start (eloop=0x1000021c690, signals=0x7feffffeb90) at eloop.c:1228
#4  0x0000010000015418 in main (argc=<optimized out>, argv=<optimized out>, envp=<optimized out>) at dhcpcd.c:2650

System setup:
Gentoo on sparc64 with 6.6.30 Linux kernel, glibc 2.40, dhcpcd 10.1.0, and clang 19.1.4.

A quick look shows that dhcp_readbpf creates an uint8_t buffer which then gets casted into a const struct ip * inside checksums_valid, but struct ip appear to have stronger alignment requirements, so when the pointer is dereferenced it crashes from the misaligned access.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions