]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
netpoll: fix IPv6 local-address corruption
authorBreno Leitao <leitao@debian.org>
Fri, 24 Apr 2026 15:31:16 +0000 (08:31 -0700)
committerJakub Kicinski <kuba@kernel.org>
Tue, 28 Apr 2026 02:16:18 +0000 (19:16 -0700)
commit3bc179bc7146c26c9dff75d2943d10528274e301
treee280e5e111a9e799cd727404c00696ec327b379f
parent2b9f6f7065d4cfb65ba19126e0b35ac4544c3f3a
netpoll: fix IPv6 local-address corruption

netpoll_setup() decides whether to auto-populate the local source
address by testing np->local_ip.ip, which only inspects the first 4
bytes of the union inet_addr storage.

For an IPv6 netpoll whose caller-supplied local address has a zero
high-32 bits (::1, ::<suffix>, IPv4-mapped ::ffff:a.b.c.d, etc.), this
misdetects the address as unset (which they are not, but the first
4 bytes are empty), calls netpoll_take_ipv6() and overwrites it with
whatever matching link-local/global address the device happens to expose
first.

Introduce a helper netpoll_local_ip_unset() that picks the correct
family-aware test (ipv6_addr_any() for IPv6, !.ip for IPv4) and use it
from netpoll_setup().

Reproducer is something like:

  echo "::2" > local_ip
  echo 1     > enabled
  cat local_ip
  # before this fix: 2001:db8::1   (caller-supplied ::2 was clobbered)
  # after  this fix: ::2

Fixes: b7394d2429c1 ("netpoll: prepare for ipv6")
Signed-off-by: Breno Leitao <leitao@debian.org>
Link: https://patch.msgid.link/20260424-netpoll_fix-v1-1-3a55348c625f@debian.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/core/netpoll.c