fix: truncate dns message in udp response

https://github.com/MetaCubeX/mihomo/issues/1168
This commit is contained in:
wwqgtxx 2024-04-09 14:16:09 +08:00
parent 72df27be44
commit bd703b8ff2

View File

@ -46,7 +46,7 @@ func RelayDnsConn(ctx context.Context, conn net.Conn, readTimeout time.Duration)
ctx, cancel := context.WithTimeout(ctx, DefaultDnsRelayTimeout) ctx, cancel := context.WithTimeout(ctx, DefaultDnsRelayTimeout)
defer cancel() defer cancel()
inData := buff[:n] inData := buff[:n]
msg, err := RelayDnsPacket(ctx, inData, buff) msg, err := relayDnsPacket(ctx, inData, buff, 0)
if err != nil { if err != nil {
return err return err
} }
@ -69,7 +69,7 @@ func RelayDnsConn(ctx context.Context, conn net.Conn, readTimeout time.Duration)
return nil return nil
} }
func RelayDnsPacket(ctx context.Context, payload []byte, target []byte) ([]byte, error) { func relayDnsPacket(ctx context.Context, payload []byte, target []byte, maxSize int) ([]byte, error) {
msg := &D.Msg{} msg := &D.Msg{}
if err := msg.Unpack(payload); err != nil { if err := msg.Unpack(payload); err != nil {
return nil, err return nil, err
@ -83,6 +83,14 @@ func RelayDnsPacket(ctx context.Context, payload []byte, target []byte) ([]byte,
} }
r.SetRcode(msg, r.Rcode) r.SetRcode(msg, r.Rcode)
if maxSize > 0 {
r.Truncate(maxSize)
}
r.Compress = true r.Compress = true
return r.PackBuffer(target) return r.PackBuffer(target)
} }
// RelayDnsPacket will truncate udp message up to SafeDnsPacketSize
func RelayDnsPacket(ctx context.Context, payload []byte, target []byte) ([]byte, error) {
return relayDnsPacket(ctx, payload, target, SafeDnsPacketSize)
}