[client] Fix DNS probe listener panic on unparseable local address

generateFreePort used netip.MustParseAddrPort on
the OS-produced LocalAddr().String(), which panics on address strings
that don't parse (e.g. IPv6 zone IDs like [::]:0%eth0). Eliminate the
parsing entirely by reading the port from the concrete *net.UDPAddr
that net.ListenUDP returns, and construct the bind address directly.
This commit is contained in:
Zoltán Papp
2026-07-16 12:08:23 +02:00
parent e1a24376ab
commit c46a101c1f

View File

@@ -292,18 +292,16 @@ func (s *serviceViaListener) generateFreePort() (uint16, error) {
return customPort, nil
}
udpAddr := net.UDPAddrFromAddrPort(netip.MustParseAddrPort("0.0.0.0:0"))
probeListener, err := net.ListenUDP("udp", udpAddr)
probeListener, err := net.ListenUDP("udp", &net.UDPAddr{})
if err != nil {
log.Debugf("failed to bind random port for DNS: %s", err)
return 0, err
}
addrPort := netip.MustParseAddrPort(probeListener.LocalAddr().String()) // might panic if address is incorrect
err = probeListener.Close()
if err != nil {
port := uint16(probeListener.LocalAddr().(*net.UDPAddr).Port)
if err = probeListener.Close(); err != nil {
log.Debugf("failed to free up DNS port: %s", err)
return 0, err
}
return addrPort.Port(), nil
return port, nil
}