mirror of
https://github.com/shtorm-7/sing-box-extended.git
synced 2026-08-07 14:25:17 +03:00
Fix local DNS transport blocking on canceled queries
This commit is contained in:
@@ -13,7 +13,6 @@ import (
|
|||||||
"github.com/sagernet/sing/common"
|
"github.com/sagernet/sing/common"
|
||||||
E "github.com/sagernet/sing/common/exceptions"
|
E "github.com/sagernet/sing/common/exceptions"
|
||||||
M "github.com/sagernet/sing/common/metadata"
|
M "github.com/sagernet/sing/common/metadata"
|
||||||
"github.com/sagernet/sing/common/task"
|
|
||||||
|
|
||||||
mDNS "github.com/miekg/dns"
|
mDNS "github.com/miekg/dns"
|
||||||
)
|
)
|
||||||
@@ -58,24 +57,23 @@ func (p *platformTransport) Exchange(ctx context.Context, message *mDNS.Msg) (*m
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
var responseMessage *mDNS.Msg
|
done := make(chan error, 1)
|
||||||
var group task.Group
|
go func() {
|
||||||
group.Append0(func(ctx context.Context) error {
|
exchangeErr := p.iif.Exchange(response, messageBytes)
|
||||||
err = p.iif.Exchange(response, messageBytes)
|
if exchangeErr == nil {
|
||||||
|
exchangeErr = response.error
|
||||||
|
}
|
||||||
|
done <- exchangeErr
|
||||||
|
}()
|
||||||
|
select {
|
||||||
|
case err = <-done:
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
if response.error != nil {
|
return &response.message, nil
|
||||||
return response.error
|
case <-ctx.Done():
|
||||||
}
|
return nil, ctx.Err()
|
||||||
responseMessage = &response.message
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
err = group.Run(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
return responseMessage, nil
|
|
||||||
} else {
|
} else {
|
||||||
question := message.Question[0]
|
question := message.Question[0]
|
||||||
var network string
|
var network string
|
||||||
@@ -87,24 +85,23 @@ func (p *platformTransport) Exchange(ctx context.Context, message *mDNS.Msg) (*m
|
|||||||
default:
|
default:
|
||||||
return nil, E.New("only IP queries are supported by current version of Android")
|
return nil, E.New("only IP queries are supported by current version of Android")
|
||||||
}
|
}
|
||||||
var responseAddrs []netip.Addr
|
done := make(chan error, 1)
|
||||||
var group task.Group
|
go func() {
|
||||||
group.Append0(func(ctx context.Context) error {
|
lookupErr := p.iif.Lookup(response, network, question.Name)
|
||||||
err := p.iif.Lookup(response, network, question.Name)
|
if lookupErr == nil {
|
||||||
|
lookupErr = response.error
|
||||||
|
}
|
||||||
|
done <- lookupErr
|
||||||
|
}()
|
||||||
|
select {
|
||||||
|
case err := <-done:
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
if response.error != nil {
|
return dns.FixedResponse(message.Id, question, response.addresses, C.DefaultDNSTTL), nil
|
||||||
return response.error
|
case <-ctx.Done():
|
||||||
}
|
return nil, ctx.Err()
|
||||||
responseAddrs = response.addresses
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
err := group.Run(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
return dns.FixedResponse(message.Id, question, responseAddrs, C.DefaultDNSTTL), nil
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user