Skip to content

Commit b4d09be

Browse files
mateusz834gopherbot
authored andcommitted
dns/dnsmessage: compress all names while appending to a buffer
Change-Id: Iedccbf3e47a63b2239def189ab41bab18a64c398 GitHub-Last-Rev: eb23195 GitHub-Pull-Request: #189 Reviewed-on: https://go-review.googlesource.com/c/net/+/522575 TryBot-Result: Gopher Robot <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]> Run-TryBot: Mateusz Poliwczak <[email protected]> Reviewed-by: Joedian Reid <[email protected]> Auto-Submit: Ian Lance Taylor <[email protected]>
1 parent 8b010a5 commit b4d09be

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

dns/dnsmessage/message.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2000,14 +2000,15 @@ func (n *Name) pack(msg []byte, compression map[string]int, compressionOff int)
20002000
}
20012001

20022002
// Miss. Add the suffix to the compression table if the
2003-
// offset can be stored in the available 14 bytes.
2004-
if len(msg) <= int(^uint16(0)>>2) {
2003+
// offset can be stored in the available 14 bits.
2004+
newPtr := len(msg) - compressionOff
2005+
if newPtr <= int(^uint16(0)>>2) {
20052006
if nameAsStr == "" {
20062007
// allocate n.Data on the heap once, to avoid allocating it
20072008
// multiple times (for next labels).
20082009
nameAsStr = string(n.Data[:n.Length])
20092010
}
2010-
compression[nameAsStr[i:]] = len(msg) - compressionOff
2011+
compression[nameAsStr[i:]] = newPtr
20112012
}
20122013
}
20132014
}

dns/dnsmessage/message_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1847,3 +1847,30 @@ func TestBuilderNameCompressionWithNonZeroedName(t *testing.T) {
18471847
t.Fatalf("b.Finish() = %v, want: %v", msg, expect)
18481848
}
18491849
}
1850+
1851+
func TestBuilderCompressionInAppendMode(t *testing.T) {
1852+
maxPtr := int(^uint16(0) >> 2)
1853+
b := NewBuilder(make([]byte, maxPtr, maxPtr+512), Header{})
1854+
b.EnableCompression()
1855+
if err := b.StartQuestions(); err != nil {
1856+
t.Fatalf("b.StartQuestions() unexpected error: %v", err)
1857+
}
1858+
if err := b.Question(Question{Name: MustNewName("go.dev.")}); err != nil {
1859+
t.Fatalf("b.Question() unexpected error: %v", err)
1860+
}
1861+
if err := b.Question(Question{Name: MustNewName("go.dev.")}); err != nil {
1862+
t.Fatalf("b.Question() unexpected error: %v", err)
1863+
}
1864+
msg, err := b.Finish()
1865+
if err != nil {
1866+
t.Fatalf("b.Finish() unexpected error: %v", err)
1867+
}
1868+
expect := []byte{
1869+
0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, // header
1870+
2, 'g', 'o', 3, 'd', 'e', 'v', 0, 0, 0, 0, 0, // question 1
1871+
0xC0, 12, 0, 0, 0, 0, // question 2
1872+
}
1873+
if !bytes.Equal(msg[maxPtr:], expect) {
1874+
t.Fatalf("msg[maxPtr:] = %v, want: %v", msg[maxPtr:], expect)
1875+
}
1876+
}

0 commit comments

Comments
 (0)