diff --git a/common/protocol/quic/sniff.go b/common/protocol/quic/sniff.go index 8719a085..779e291b 100644 --- a/common/protocol/quic/sniff.go +++ b/common/protocol/quic/sniff.go @@ -1,6 +1,7 @@ package quic import ( + "context" "crypto" "crypto/aes" "crypto/tls" @@ -46,7 +47,18 @@ var ( errNotQuicInitial = errors.New("not initial packet") ) -func SniffQUIC(b []byte) (*SniffHeader, error) { +func SniffQUIC(b []byte) (resultReturn *SniffHeader, errorReturn error) { + // In extremely rare cases, this sniffer may cause slice error + // and we set recover() here to prevent crash. + // TODO: Thoroughly fix this panic + defer func() { + if r := recover(); r != nil { + errors.LogError(context.Background(), "Failed to sniff QUIC: ", r) + resultReturn = nil + errorReturn = common.ErrNoClue + } + }() + // Crypto data separated across packets cryptoLen := 0 cryptoData := bytespool.Alloc(int32(len(b)))