Skip to content

Commit 939e410

Browse files
committed
chore: write dns reply in single syscall
1 parent 40587b6 commit 939e410

File tree

1 file changed

+12
-5
lines changed

1 file changed

+12
-5
lines changed

component/resolver/relay.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,17 +46,24 @@ func RelayDnsConn(ctx context.Context, conn net.Conn, readTimeout time.Duration)
4646
ctx, cancel := context.WithTimeout(ctx, DefaultDnsRelayTimeout)
4747
defer cancel()
4848
inData := buff[:n]
49-
msg, err := relayDnsPacket(ctx, inData, buff, 0)
49+
outBuff := buff[2:]
50+
msg, err := relayDnsPacket(ctx, inData, outBuff, 0)
5051
if err != nil {
5152
return err
5253
}
5354

54-
err = binary.Write(conn, binary.BigEndian, uint16(len(msg)))
55-
if err != nil {
56-
return err
55+
if &msg[0] == &outBuff[0] { // msg is still in the buff
56+
binary.BigEndian.PutUint16(buff[:2], uint16(len(msg)))
57+
outBuff = buff[:2+len(msg)]
58+
} else { // buff not big enough (WTF???)
59+
newBuff := pool.Get(len(msg) + 2)
60+
defer pool.Put(newBuff)
61+
binary.BigEndian.PutUint16(newBuff[:2], uint16(len(msg)))
62+
copy(newBuff[2:], msg)
63+
outBuff = newBuff
5764
}
5865

59-
_, err = conn.Write(msg)
66+
_, err = conn.Write(outBuff)
6067
if err != nil {
6168
return err
6269
}

0 commit comments

Comments
 (0)