Skip to content

Commit 31b84e8

Browse files
fix: fixes the panic output, need to parse for each record separately
Signed-off-by: Aditya Kumar Singh <sadityakumar9211@gmail.com>
1 parent 7aa8e74 commit 31b84e8

File tree

2 files changed

+66
-31
lines changed

2 files changed

+66
-31
lines changed

internal/dns/dns.go

Lines changed: 41 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ import (
88
"github.com/sadityakumar9211/go-res/pkg/bytepacketbuffer"
99
)
1010

11-
// ResultCode represents DNS result codes.
12-
type ResultCode uint8
1311

12+
type ResultCode uint8
13+
type QueryType int
14+
15+
// ResultCode represents DNS result codes.
1416
const (
1517
NOERROR ResultCode = 0
1618
FORMERR ResultCode = 1
@@ -20,7 +22,17 @@ const (
2022
REFUSED ResultCode = 5
2123
)
2224

23-
// DnsHeader represents DNS packet header.
25+
// QueryType represents DNS query types.
26+
const (
27+
UNKNOWN QueryType = iota
28+
A
29+
NS
30+
CNAME
31+
MX
32+
AAAA
33+
)
34+
35+
// DnsHeader represents header of DNS packet.
2436
type DnsHeader struct {
2537
ID uint16
2638
RecursionDesired bool
@@ -142,18 +154,6 @@ func (h *DnsHeader) Write(buffer *bytepacketbuffer.BytePacketBuffer) error {
142154
return nil
143155
}
144156

145-
// QueryType represents DNS query types.
146-
type QueryType int
147-
148-
const (
149-
UNKNOWN QueryType = iota
150-
A
151-
NS
152-
CNAME
153-
MX
154-
AAAA
155-
)
156-
157157
// QueryTypeFromNum converts a numerical query type to QueryType.
158158
func QueryTypeFromNum(num uint16) QueryType {
159159
switch num {
@@ -186,7 +186,7 @@ func (q QueryType) QueryTypeToNum() uint16 {
186186
case AAAA:
187187
return 28
188188
default:
189-
return 0
189+
return 0 // UNKNOWN
190190
}
191191
}
192192

@@ -545,12 +545,14 @@ func (r *MXRecord) Write(buffer *bytepacketbuffer.BytePacketBuffer) (uint, error
545545
if err := buffer.WriteQName(r.Domain); err != nil {
546546
return 0, err
547547
}
548+
// Query Type
548549
if err := buffer.WriteU16(MX.QueryTypeToNum()); err != nil {
549550
return 0, err
550551
}
551552
if err := buffer.WriteU16(1); err != nil {
552553
return 0, err
553-
} // class
554+
}
555+
// class
554556
if err := buffer.WriteU32(r.TTL); err != nil {
555557
return 0, err
556558
}
@@ -673,26 +675,29 @@ type UNKNOWNRecord struct {
673675
}
674676

675677
func (u *UNKNOWNRecord) Read(buffer *bytepacketbuffer.BytePacketBuffer) error {
676-
// Domain Name
678+
// Domain Name
677679
if err := buffer.ReadQName(&u.Domain); err != nil {
678680
return err
679681
}
680-
// QueryType
682+
683+
// QueryType - 2 byte
681684
if _, err := buffer.ReadU16(); err != nil {
682685
return err
683686
}
684687

688+
// Ignoring the class type - 2 byte
685689
if _, err := buffer.ReadU16(); err != nil {
686690
return err
687691
}
688692

693+
// TTL - 2 byte
689694
if ttl, err := buffer.ReadU32(); err != nil {
690695
return err
691696
} else {
692697
u.TTL = ttl
693698
}
694699

695-
// data length, ignored
700+
// data length, ignored - 2 byte
696701
dataLength, err := buffer.ReadU16()
697702
if err != nil {
698703
return err
@@ -714,6 +719,10 @@ func (a *UNKNOWNRecord) ExtractIPv4() net.IP {
714719
return nil
715720
}
716721

722+
func (a *UNKNOWNRecord) GetDomain() string {
723+
return a.Domain
724+
}
725+
717726
// DnsPacket represents a DNS packet.
718727
type DnsPacket struct {
719728
Header *DnsHeader
@@ -734,6 +743,11 @@ func NewDnsPacket() *DnsPacket {
734743
}
735744
}
736745

746+
// // FindRecordType returns correctly parsed DnsRecord
747+
// func FindRecordType(rec *UNKNOWNRecord) (*DnsRecord, error) {
748+
749+
// }
750+
737751
// FromBuffer creates a new DNS packet from the buffer.
738752
func FromBuffer(buffer *bytepacketbuffer.BytePacketBuffer) (*DnsPacket, error) {
739753
packet := NewDnsPacket()
@@ -748,24 +762,27 @@ func FromBuffer(buffer *bytepacketbuffer.BytePacketBuffer) (*DnsPacket, error) {
748762

749763
// Reading answers from the buffer
750764
for i := uint16(0); i < packet.Header.Answers; i++ {
751-
var rec DnsRecord
765+
rec := &UNKNOWNRecord{}
766+
// var rec DnsRecord
752767
if err := rec.Read(buffer); err != nil {
753768
return nil, err
754769
}
770+
771+
// newRecType := FindRecordType(rec)
755772
packet.Answers = append(packet.Answers, rec)
756773
}
757774
// Reading authoritative entries from the buffer
758775
for i := uint16(0); i < packet.Header.AuthoritativeEntries; i++ {
759776
fmt.Println("authoritative enteries", len(packet.Authorities), "len in header: ", packet.Header.AuthoritativeEntries)
760-
var rec DnsRecord
777+
rec := &UNKNOWNRecord{}
761778
if err := rec.Read(buffer); err != nil {
762779
return nil, err
763780
}
764781
packet.Authorities = append(packet.Authorities, rec)
765782
}
766-
// Reading answers from the buffer
783+
// Reading Resources from the buffer
767784
for i := uint16(0); i < uint16(len(packet.Resources)); i++ {
768-
var rec DnsRecord
785+
rec := &UNKNOWNRecord{}
769786
if err := rec.Read(buffer); err != nil {
770787
return nil, err
771788
}

pkg/bytepacketbuffer/bytepacketbuffer.go

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,50 +7,58 @@ import (
77
// BytePacketBuffer is a buffer for working with binary data.
88
type BytePacketBuffer struct {
99
Buf [512]byte
10-
Pos int
10+
Pos int // buffer pointer to track current position.
1111
}
1212

13+
// NewBytePacketBuffer creates and returns a new BytePacketBuffer with default values.
1314
func NewBytePacketBuffer() BytePacketBuffer {
1415
return BytePacketBuffer{}
1516
}
1617

18+
// GetPos returns the current buffer pointer.
1719
func (b *BytePacketBuffer) GetPos() int {
1820
return b.Pos
1921
}
2022

23+
// Step moves the buffer pointer by steps amount.
2124
func (b *BytePacketBuffer) Step(steps int) error {
2225
b.Pos += steps
2326
return nil
2427
}
2528

29+
// Seek sets the buffer pointer to pos.
2630
func (b *BytePacketBuffer) Seek(pos int) error {
2731
b.Pos = pos
2832
return nil
2933
}
3034

35+
// Read reads a single byte from buffer and moves buffer pointer by same amount.
3136
func (b *BytePacketBuffer) Read() (byte, error) {
3237
if b.Pos >= 512 {
33-
return 0, errors.New("End of buffer")
38+
return 0, errors.New("end of buffer")
3439
}
3540
res := b.Buf[b.Pos]
3641
b.Pos++
3742
return res, nil
3843
}
3944

45+
// Get returns a buffer byte at pos without changing buffer pointer.
4046
func (b *BytePacketBuffer) Get(pos int) (byte, error) {
4147
if pos >= 512 {
42-
return 0, errors.New("End of buffer")
48+
return 0, errors.New("end of buffer")
4349
}
4450
return b.Buf[pos], nil
4551
}
4652

53+
// GetRange returns buffer bits from start with specified length without moving buffer pointer.
4754
func (b *BytePacketBuffer) GetRange(start int, length int) ([]byte, error) {
4855
if start+length >= 512 {
49-
return nil, errors.New("End of buffer")
56+
return nil, errors.New("end of buffer")
5057
}
5158
return b.Buf[start : start+length], nil
5259
}
5360

61+
// ReadU16 reads 2 buffer bytes and moves buffer pointer.
5462
func (b *BytePacketBuffer) ReadU16() (uint16, error) {
5563
val1, err := b.Read()
5664
if err != nil {
@@ -63,6 +71,7 @@ func (b *BytePacketBuffer) ReadU16() (uint16, error) {
6371
return (uint16(val1) << 8) | uint16(val2), nil
6472
}
6573

74+
// ReadU32 reads 4 buffer bytes and moves buffer pointer.
6675
func (b *BytePacketBuffer) ReadU32() (uint32, error) {
6776
val1, err := b.Read()
6877
if err != nil {
@@ -83,6 +92,7 @@ func (b *BytePacketBuffer) ReadU32() (uint32, error) {
8392
return (uint32(val1) << 24) | (uint32(val2) << 16) | (uint32(val3) << 8) | uint32(val4), nil
8493
}
8594

95+
// ReadQName reads DNS question name and moves buffer pointer.
8696
func (b *BytePacketBuffer) ReadQName(outstr *string) error {
8797
pos := b.GetPos()
8898
jumped := false
@@ -92,7 +102,7 @@ func (b *BytePacketBuffer) ReadQName(outstr *string) error {
92102

93103
for {
94104
if jumpsPerformed > maxJumps {
95-
return errors.New("Limit of 5 jumps exceeded")
105+
return errors.New("limit of 5 jumps exceeded")
96106
}
97107

98108
lenVal, err := b.Get(pos)
@@ -137,25 +147,29 @@ func (b *BytePacketBuffer) ReadQName(outstr *string) error {
137147
return nil
138148
}
139149

150+
// Write writes a byte to buffer and moves buffer pointer.
140151
func (b *BytePacketBuffer) Write(val byte) error {
141152
if b.Pos >= 512 {
142-
return errors.New("End of buffer")
153+
return errors.New("end of buffer")
143154
}
144155
b.Buf[b.Pos] = val
145156
b.Pos++
146157
return nil
147158
}
148159

160+
// WriteU8 writes 1 byte to buffer and moves buffer pointer.
149161
func (b *BytePacketBuffer) WriteU8(val byte) error {
150162
return b.Write(val)
151163
}
152164

165+
// WriteU16 writes 2 bytes to buffer and moves buffer pointer.
153166
func (b *BytePacketBuffer) WriteU16(val uint16) error {
154167
b.Write(byte(val >> 8))
155168
b.Write(byte(val & 0xFF))
156169
return nil
157170
}
158171

172+
// WriteU32 writes 4 bytes to buffer and moves buffer pointer.
159173
func (b *BytePacketBuffer) WriteU32(val uint32) error {
160174
b.Write(byte((val >> 24) & 0xFF))
161175
b.Write(byte((val >> 16) & 0xFF))
@@ -164,11 +178,12 @@ func (b *BytePacketBuffer) WriteU32(val uint32) error {
164178
return nil
165179
}
166180

181+
// WriteQName writes Question name to the buffer and moves buffer pointer.
167182
func (b *BytePacketBuffer) WriteQName(qname string) error {
168183
for _, label := range SplitDNSName(qname) {
169184
lenVal := byte(len(label))
170185
if lenVal > 0x34 {
171-
return errors.New("Single label exceeds 63 characters of length")
186+
return errors.New("single label exceeds 63 characters of length")
172187
}
173188
b.WriteU8(lenVal)
174189
for _, ch := range label {
@@ -179,17 +194,20 @@ func (b *BytePacketBuffer) WriteQName(qname string) error {
179194
return nil
180195
}
181196

197+
// Set overwrite a byte from the given position.
182198
func (b *BytePacketBuffer) Set(pos int, val byte) error {
183199
b.Buf[pos] = val
184200
return nil
185201
}
186202

203+
// SetU16 overwrites 2 bytes from the given position.
187204
func (b *BytePacketBuffer) SetU16(pos int, val uint16) error {
188205
b.Set(pos, byte(val>>8))
189206
b.Set(pos+1, byte(val&0xFF))
190207
return nil
191208
}
192209

210+
// SplitDNSName splits question name string to multiple labels and returns an slice of labels.
193211
func SplitDNSName(qname string) []string {
194212
labels := make([]string, 0)
195213
labelStart := 0

0 commit comments

Comments
 (0)