fix: prevent QUIC reload panic by lazily initializing the listener (#7680)

* fix: prevent QUIC reload panic by lazily initializing the listener

ServePacket on reload receives the reused PacketConn before the new
ServerQUIC has recreated its quic.Listener, so quicListener is nil and
the process panics. Lazily initialise quicListener from the provided
PacketConn when it’s nil and then proceed with ServeQUIC.

fixes: #7679
Signed-off-by: Nico Berlee <nico.berlee@on2it.net>

* test: add regression test for QUIC reload panic

Signed-off-by: Nico Berlee <nico.berlee@on2it.net>

---------

Signed-off-by: Nico Berlee <nico.berlee@on2it.net>
This commit is contained in:
Nico Berlee
2025-11-18 17:34:29 +01:00
committed by GitHub
parent db64962253
commit 7d7bbc8061
2 changed files with 84 additions and 0 deletions

View File

@@ -103,6 +103,14 @@ func NewServerQUIC(addr string, group []*Config) (*ServerQUIC, error) {
// ServePacket implements caddy.UDPServer interface.
func (s *ServerQUIC) ServePacket(p net.PacketConn) error {
s.m.Lock()
if s.quicListener == nil {
listener, err := quic.Listen(p, s.tlsConfig, s.quicConfig)
if err != nil {
s.m.Unlock()
return err
}
s.quicListener = listener
}
s.listenAddr = s.quicListener.Addr()
s.m.Unlock()