Explorar o código

Sniff: Prevent crash on QUIC sniffer panic (#3978)

Co-authored-by: RPRX <[email protected]>
风扇滑翔翼 hai 11 meses
pai
achega
1ffb8a92cd
Modificáronse 1 ficheiros con 13 adicións e 1 borrados
  1. 13 1
      common/protocol/quic/sniff.go

+ 13 - 1
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)))