From 1db89da122814d957cbd433d850e738006c309cd Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Wed, 28 May 2025 09:22:28 +0800 Subject: [PATCH] fix: quic sniffer should not replace domain when no valid host is read --- component/sniffer/quic_sniffer.go | 9 +++++--- component/sniffer/sniff_test.go | 34 +++++++++++++++++++++++-------- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/component/sniffer/quic_sniffer.go b/component/sniffer/quic_sniffer.go index 0eac36fa..38fa7568 100644 --- a/component/sniffer/quic_sniffer.go +++ b/component/sniffer/quic_sniffer.go @@ -88,7 +88,7 @@ type quicPacketSender struct { lock sync.RWMutex ranges utils.IntRanges[uint64] buffer []byte - result string + result *string override bool constant.PacketSender @@ -121,7 +121,10 @@ func (q *quicPacketSender) DoSniff(metadata *constant.Metadata) error { select { case <-q.chClose: q.lock.RLock() - replaceDomain(metadata, q.result, q.override) + if q.result != nil { + host := *q.result + replaceDomain(metadata, host, q.override) + } q.lock.RUnlock() break case <-time.After(quicWaitConn): @@ -428,7 +431,7 @@ func (q *quicPacketSender) tryAssemble() error { } q.lock.Lock() - q.result = *domain + q.result = domain q.closeLocked() q.lock.Unlock() diff --git a/component/sniffer/sniff_test.go b/component/sniffer/sniff_test.go index f8a5583a..6a535646 100644 --- a/component/sniffer/sniff_test.go +++ b/component/sniffer/sniff_test.go @@ -67,10 +67,12 @@ func asPacket(data string) constant.PacketAdapter { return pktAdp } -func testQuicSniffer(data []string, async bool) (string, error) { +const fakeHost = "fake.host.com" + +func testQuicSniffer(data []string, async bool) (string, string, error) { q, err := NewQuicSniffer(SnifferConfig{}) if err != nil { - return "", err + return "", "", err } resultCh := make(chan *constant.Metadata, 1) @@ -79,7 +81,7 @@ func testQuicSniffer(data []string, async bool) (string, error) { sender := q.WrapperSender(emptySender, true) go func() { - meta := constant.Metadata{} + meta := constant.Metadata{Host: fakeHost} err := sender.DoSniff(&meta) if err != nil { panic(err) @@ -96,14 +98,15 @@ func testQuicSniffer(data []string, async bool) (string, error) { } meta := <-resultCh - return meta.SniffHost, nil + return meta.SniffHost, meta.Host, nil } func TestQuicHeaders(t *testing.T) { cases := []struct { - input []string - domain string + input []string + domain string + invalid bool }{ //Normal domain quic sniff { @@ -161,16 +164,31 @@ func TestQuicHeaders(t *testing.T) { }, domain: "www.google.com", }, + // invalid packet + { + input: []string{"00000000000000000000"}, + invalid: true, + }, } for _, test := range cases { - data, err := testQuicSniffer(test.input, true) + data, host, err := testQuicSniffer(test.input, true) assert.NoError(t, err) assert.Equal(t, test.domain, data) + if test.invalid { + assert.Equal(t, fakeHost, host) + } else { + assert.Equal(t, test.domain, host) + } - data, err = testQuicSniffer(test.input, false) + data, host, err = testQuicSniffer(test.input, false) assert.NoError(t, err) assert.Equal(t, test.domain, data) + if test.invalid { + assert.Equal(t, fakeHost, host) + } else { + assert.Equal(t, test.domain, host) + } } }