Skip to content

Commit 1db89da

Browse files
committed
fix: quic sniffer should not replace domain when no valid host is read
1 parent 689c58f commit 1db89da

File tree

2 files changed

+32
-11
lines changed

2 files changed

+32
-11
lines changed

component/sniffer/quic_sniffer.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ type quicPacketSender struct {
8888
lock sync.RWMutex
8989
ranges utils.IntRanges[uint64]
9090
buffer []byte
91-
result string
91+
result *string
9292
override bool
9393

9494
constant.PacketSender
@@ -121,7 +121,10 @@ func (q *quicPacketSender) DoSniff(metadata *constant.Metadata) error {
121121
select {
122122
case <-q.chClose:
123123
q.lock.RLock()
124-
replaceDomain(metadata, q.result, q.override)
124+
if q.result != nil {
125+
host := *q.result
126+
replaceDomain(metadata, host, q.override)
127+
}
125128
q.lock.RUnlock()
126129
break
127130
case <-time.After(quicWaitConn):
@@ -428,7 +431,7 @@ func (q *quicPacketSender) tryAssemble() error {
428431
}
429432

430433
q.lock.Lock()
431-
q.result = *domain
434+
q.result = domain
432435
q.closeLocked()
433436
q.lock.Unlock()
434437

component/sniffer/sniff_test.go

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,12 @@ func asPacket(data string) constant.PacketAdapter {
6767
return pktAdp
6868
}
6969

70-
func testQuicSniffer(data []string, async bool) (string, error) {
70+
const fakeHost = "fake.host.com"
71+
72+
func testQuicSniffer(data []string, async bool) (string, string, error) {
7173
q, err := NewQuicSniffer(SnifferConfig{})
7274
if err != nil {
73-
return "", err
75+
return "", "", err
7476
}
7577

7678
resultCh := make(chan *constant.Metadata, 1)
@@ -79,7 +81,7 @@ func testQuicSniffer(data []string, async bool) (string, error) {
7981
sender := q.WrapperSender(emptySender, true)
8082

8183
go func() {
82-
meta := constant.Metadata{}
84+
meta := constant.Metadata{Host: fakeHost}
8385
err := sender.DoSniff(&meta)
8486
if err != nil {
8587
panic(err)
@@ -96,14 +98,15 @@ func testQuicSniffer(data []string, async bool) (string, error) {
9698
}
9799

98100
meta := <-resultCh
99-
return meta.SniffHost, nil
101+
return meta.SniffHost, meta.Host, nil
100102
}
101103

102104
func TestQuicHeaders(t *testing.T) {
103105

104106
cases := []struct {
105-
input []string
106-
domain string
107+
input []string
108+
domain string
109+
invalid bool
107110
}{
108111
//Normal domain quic sniff
109112
{
@@ -161,16 +164,31 @@ func TestQuicHeaders(t *testing.T) {
161164
},
162165
domain: "www.google.com",
163166
},
167+
// invalid packet
168+
{
169+
input: []string{"00000000000000000000"},
170+
invalid: true,
171+
},
164172
}
165173

166174
for _, test := range cases {
167-
data, err := testQuicSniffer(test.input, true)
175+
data, host, err := testQuicSniffer(test.input, true)
168176
assert.NoError(t, err)
169177
assert.Equal(t, test.domain, data)
178+
if test.invalid {
179+
assert.Equal(t, fakeHost, host)
180+
} else {
181+
assert.Equal(t, test.domain, host)
182+
}
170183

171-
data, err = testQuicSniffer(test.input, false)
184+
data, host, err = testQuicSniffer(test.input, false)
172185
assert.NoError(t, err)
173186
assert.Equal(t, test.domain, data)
187+
if test.invalid {
188+
assert.Equal(t, fakeHost, host)
189+
} else {
190+
assert.Equal(t, test.domain, host)
191+
}
174192
}
175193
}
176194

0 commit comments

Comments
 (0)