aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2025-01-15 02:11:38 +0700
committerShulhan <ms@kilabit.info>2025-01-15 02:12:31 +0700
commit224d28984050b04e60fe1228403535271568e80d (patch)
treead847aeef193ceac57fd6d250d91631e83dba8f4
parent1a5deb3b630a406896e42c08c764f6f267d2bc75 (diff)
downloadpakakeh.go-224d28984050b04e60fe1228403535271568e80d.tar.xz
lib/dns: fix unpacking resource data on HTTPS record
Instead of passing the whole packet, pass the packet for unpacking target name only and rdata for unpacking the SVCB HTTPS record.
-rw-r--r--lib/dns/message_test.go37
-rw-r--r--lib/dns/rdata_svcb.go18
-rw-r--r--lib/dns/resource_record.go10
-rw-r--r--lib/dns/testdata/message/UnpackMessage_HTTPS_test.txt77
-rw-r--r--lib/dns/testdata/message/UnpackMessage_SVCB_test.txt2
5 files changed, 128 insertions, 16 deletions
diff --git a/lib/dns/message_test.go b/lib/dns/message_test.go
index 824ace68..8a1d47b2 100644
--- a/lib/dns/message_test.go
+++ b/lib/dns/message_test.go
@@ -2178,3 +2178,40 @@ func TestUnpackMessage_SVCB(t *testing.T) {
test.Assert(t, name, string(tdata.Output[name]), string(stream))
}
}
+
+func TestUnpackMessage_HTTPS(t *testing.T) {
+ var (
+ logp = `TestUnpackMessage_HTTPS`
+ tdata *test.Data
+ err error
+ )
+
+ tdata, err = test.LoadData(`testdata/message/UnpackMessage_HTTPS_test.txt`)
+ if err != nil {
+ t.Fatal(logp, err)
+ }
+
+ var (
+ name string
+ input []byte
+ stream []byte
+ msg *Message
+ )
+ for name, input = range tdata.Input {
+ stream, err = hexdump.Parse(input, true)
+ if err != nil {
+ t.Fatal(logp, err)
+ }
+
+ msg, err = UnpackMessage(stream)
+ if err != nil {
+ t.Fatal(logp, name, err)
+ }
+
+ stream, err = json.MarshalIndent(&msg, ``, ` `)
+ if err != nil {
+ t.Fatal(logp, err)
+ }
+ test.Assert(t, name, string(tdata.Output[name]), string(stream))
+ }
+}
diff --git a/lib/dns/rdata_svcb.go b/lib/dns/rdata_svcb.go
index 098e6b08..306b6f48 100644
--- a/lib/dns/rdata_svcb.go
+++ b/lib/dns/rdata_svcb.go
@@ -553,19 +553,19 @@ func (svcb *RDataSVCB) parseParams(zp *zoneParser) (err error) {
return nil
}
-func (svcb *RDataSVCB) unpack(packet []byte) (err error) {
- svcb.Priority = libbytes.ReadUint16(packet, 0)
- packet = packet[2:]
-
- var x uint
+func (svcb *RDataSVCB) unpack(packet, rdata []byte, start uint) (err error) {
+ svcb.Priority = libbytes.ReadUint16(rdata, 0)
+ rdata = rdata[2:]
+ start += 2
- svcb.TargetName, x, err = unpackDomainName(packet, 0)
+ var end uint
+ svcb.TargetName, end, err = unpackDomainName(packet, start)
if err != nil {
return err
}
- packet = packet[x:]
-
- err = svcb.unpackParams(packet)
+ start = end - start
+ rdata = rdata[start:]
+ err = svcb.unpackParams(rdata)
if err != nil {
return err
}
diff --git a/lib/dns/resource_record.go b/lib/dns/resource_record.go
index ff8fe157..c0c04b23 100644
--- a/lib/dns/resource_record.go
+++ b/lib/dns/resource_record.go
@@ -539,11 +539,10 @@ func (rr *ResourceRecord) unpackSVCB(packet []byte, x uint) (err error) {
svcb = &RDataSVCB{
Params: map[int][]string{},
}
+ rdata = packet[x : x+uint(rr.rdlen)]
)
- packet = packet[x:]
-
- err = svcb.unpack(packet)
+ err = svcb.unpack(packet, rdata, x)
if err != nil {
return fmt.Errorf(`%s: %w`, logp, err)
}
@@ -561,11 +560,10 @@ func (rr *ResourceRecord) unpackHTTPS(packet []byte, x uint) (err error) {
Params: map[int][]string{},
},
}
+ rdata = packet[x : x+uint(rr.rdlen)]
)
- packet = packet[x:]
-
- err = https.RDataSVCB.unpack(packet)
+ err = https.RDataSVCB.unpack(packet, rdata, x)
if err != nil {
return fmt.Errorf(`%s: %w`, logp, err)
}
diff --git a/lib/dns/testdata/message/UnpackMessage_HTTPS_test.txt b/lib/dns/testdata/message/UnpackMessage_HTTPS_test.txt
new file mode 100644
index 00000000..80c1f58d
--- /dev/null
+++ b/lib/dns/testdata/message/UnpackMessage_HTTPS_test.txt
@@ -0,0 +1,77 @@
+
+>>> graph.facebook.com
+0000000 4a42 8180 0001 0003 0000 0000 0567 7261
+0000010 7068 0866 6163 6562 6f6f 6b03 636f 6d00
+0000020 0041 0001 c00c 0005 0001 0000 0bc3 000c
+0000030 0473 7461 7204 6331 3072 c012 c030 0041
+0000040 0001 0000 19d3 000d 0001 0000 0100 0602
+0000050 6832 0268 33c0 3000 4100 0100 0019 d300
+0000060 2d00 0204 7374 6172 0866 616c 6c62 6163
+0000070 6b04 6331 3072 0866 6163 6562 6f6f 6b03
+0000080 636f 6d00 0001 0006 0268 3202 6833
+
+<<< graph.facebook.com
+{
+ "Answer": [
+ {
+ "Value": "star.c10r.facebook.com",
+ "Name": "graph.facebook.com",
+ "Type": 5,
+ "Class": 1,
+ "TTL": 3011
+ },
+ {
+ "Value": {
+ "Params": {
+ "1": [
+ "h2",
+ "h3"
+ ]
+ },
+ "TargetName": "",
+ "Priority": 1
+ },
+ "Name": "star.c10r.facebook.com",
+ "Type": 65,
+ "Class": 1,
+ "TTL": 6611
+ },
+ {
+ "Value": {
+ "Params": {
+ "1": [
+ "h2",
+ "h3"
+ ]
+ },
+ "TargetName": "star.fallback.c10r.facebook.com",
+ "Priority": 2
+ },
+ "Name": "star.c10r.facebook.com",
+ "Type": 65,
+ "Class": 1,
+ "TTL": 6611
+ }
+ ],
+ "Authority": null,
+ "Additional": null,
+ "Question": {
+ "Name": "graph.facebook.com",
+ "Type": 65,
+ "Class": 1
+ },
+ "Header": {
+ "ID": 19010,
+ "IsQuery": false,
+ "Op": 0,
+ "IsAA": false,
+ "IsTC": false,
+ "IsRD": true,
+ "IsRA": true,
+ "RCode": 0,
+ "QDCount": 1,
+ "ANCount": 3,
+ "NSCount": 0,
+ "ARCount": 0
+ }
+}
diff --git a/lib/dns/testdata/message/UnpackMessage_SVCB_test.txt b/lib/dns/testdata/message/UnpackMessage_SVCB_test.txt
index 8454905f..1162c6fb 100644
--- a/lib/dns/testdata/message/UnpackMessage_SVCB_test.txt
+++ b/lib/dns/testdata/message/UnpackMessage_SVCB_test.txt
@@ -4,7 +4,7 @@ The test input taken from output of parsing SVCB record from zone file.
>>> AliasMode
0000000 0000 8400 0001 0001 0000 0000 0765 7861
0000010 6d70 6c65 0363 6f6d 0000 4100 01c0 0c00
-0000020 4100 0100 0000 3c00 1100 0003 666f 6f07
+0000020 4100 0100 0000 3c00 1300 0003 666f 6f07
0000030 6578 616d 706c 6503 636f 6d00
<<< AliasMode