diff options
| author | Shulhan <ms@kilabit.info> | 2025-01-15 02:11:38 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2025-01-15 02:12:31 +0700 |
| commit | 224d28984050b04e60fe1228403535271568e80d (patch) | |
| tree | ad847aeef193ceac57fd6d250d91631e83dba8f4 | |
| parent | 1a5deb3b630a406896e42c08c764f6f267d2bc75 (diff) | |
| download | pakakeh.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.go | 37 | ||||
| -rw-r--r-- | lib/dns/rdata_svcb.go | 18 | ||||
| -rw-r--r-- | lib/dns/resource_record.go | 10 | ||||
| -rw-r--r-- | lib/dns/testdata/message/UnpackMessage_HTTPS_test.txt | 77 | ||||
| -rw-r--r-- | lib/dns/testdata/message/UnpackMessage_SVCB_test.txt | 2 |
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 |
