mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2025-07-18 17:08:06 +08:00
fix: quic sniffer should not replace domain when no valid host is read
This commit is contained in:
@ -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()
|
||||
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user