@@ -43,6 +43,10 @@ static void rr_destructor(void *data)
43
43
mem_deref (rr -> rdata .mx .exchange );
44
44
break ;
45
45
46
+ case DNS_TYPE_TXT :
47
+ mem_deref (rr -> rdata .txt .data );
48
+ break ;
49
+
46
50
case DNS_TYPE_SRV :
47
51
mem_deref (rr -> rdata .srv .target );
48
52
break ;
@@ -83,8 +87,8 @@ int dns_rr_encode(struct mbuf *mb, const struct dnsrr *rr, int64_t ttl_offs,
83
87
struct hash * ht_dname , size_t start )
84
88
{
85
89
uint32_t ttl ;
86
- uint16_t len ;
87
- size_t start_rdata ;
90
+ size_t start_rdata , dlen , len ;
91
+ char * ptr ;
88
92
int err = 0 ;
89
93
90
94
if (!mb || !rr )
@@ -139,6 +143,21 @@ int dns_rr_encode(struct mbuf *mb, const struct dnsrr *rr, int64_t ttl_offs,
139
143
ht_dname , start , true);
140
144
break ;
141
145
146
+ case DNS_TYPE_TXT :
147
+ ptr = rr -> rdata .txt .data ;
148
+ dlen = str_len (rr -> rdata .txt .data );
149
+
150
+ do {
151
+ uint8_t slen = min (dlen , 0xff );
152
+
153
+ err |= mbuf_write_u8 (mb , slen );
154
+ err |= mbuf_write_mem (mb , (uint8_t * )ptr , slen );
155
+
156
+ ptr += slen ;
157
+ dlen -= slen ;
158
+ } while (dlen > 0 );
159
+ break ;
160
+
142
161
case DNS_TYPE_AAAA :
143
162
err |= mbuf_write_mem (mb , rr -> rdata .aaaa .addr , 16 );
144
163
break ;
@@ -167,6 +186,10 @@ int dns_rr_encode(struct mbuf *mb, const struct dnsrr *rr, int64_t ttl_offs,
167
186
}
168
187
169
188
len = mb -> pos - start_rdata ;
189
+
190
+ if (len > 0xffff )
191
+ return EOVERFLOW ;
192
+
170
193
mb -> pos = start_rdata - 2 ;
171
194
err |= mbuf_write_u16 (mb , htons (len ));
172
195
mb -> pos += len ;
@@ -188,6 +211,8 @@ int dns_rr_decode(struct mbuf *mb, struct dnsrr **rr, size_t start)
188
211
{
189
212
int err = 0 ;
190
213
struct dnsrr * lrr ;
214
+ uint16_t rdlen ;
215
+ char * ptr ;
191
216
192
217
if (!mb || !rr )
193
218
return EINVAL ;
@@ -272,6 +297,31 @@ int dns_rr_decode(struct mbuf *mb, struct dnsrr **rr, size_t start)
272
297
273
298
break ;
274
299
300
+ case DNS_TYPE_TXT :
301
+ ptr = lrr -> rdata .txt .data = mem_alloc (lrr -> rdlen + 1 , NULL );
302
+ if (!lrr -> rdata .txt .data ) {
303
+ err = ENOMEM ;
304
+ goto error ;
305
+ }
306
+
307
+ rdlen = lrr -> rdlen ;
308
+
309
+ while (rdlen > 0 ) {
310
+
311
+ uint8_t len = mbuf_read_u8 (mb );
312
+
313
+ if (len > -- rdlen )
314
+ goto fmerr ;
315
+
316
+ mbuf_read_mem (mb , (uint8_t * )ptr , len );
317
+
318
+ ptr += len ;
319
+ rdlen -= len ;
320
+ }
321
+
322
+ * ptr = '\0' ;
323
+ break ;
324
+
275
325
case DNS_TYPE_AAAA :
276
326
if (lrr -> rdlen != 16 )
277
327
goto fmerr ;
@@ -429,6 +479,13 @@ bool dns_rr_cmp(const struct dnsrr *rr1, const struct dnsrr *rr2, bool rdata)
429
479
430
480
break ;
431
481
482
+ case DNS_TYPE_TXT :
483
+ if (str_casecmp (rr1 -> rdata .txt .data ,
484
+ rr2 -> rdata .txt .data ))
485
+ return false;
486
+
487
+ break ;
488
+
432
489
case DNS_TYPE_AAAA :
433
490
if (memcmp (rr1 -> rdata .aaaa .addr , rr2 -> rdata .aaaa .addr , 16 ))
434
491
return false;
@@ -504,6 +561,7 @@ const char *dns_rr_typename(uint16_t type)
504
561
case DNS_TYPE_SOA : return "SOA" ;
505
562
case DNS_TYPE_PTR : return "PTR" ;
506
563
case DNS_TYPE_MX : return "MX" ;
564
+ case DNS_TYPE_TXT : return "TXT" ;
507
565
case DNS_TYPE_AAAA : return "AAAA" ;
508
566
case DNS_TYPE_SRV : return "SRV" ;
509
567
case DNS_TYPE_NAPTR : return "NAPTR" ;
@@ -598,6 +656,10 @@ int dns_rr_print(struct re_printf *pf, const struct dnsrr *rr)
598
656
rr -> rdata .mx .exchange );
599
657
break ;
600
658
659
+ case DNS_TYPE_TXT :
660
+ err |= re_hprintf (pf , "\"%s\"" , rr -> rdata .txt .data );
661
+ break ;
662
+
601
663
case DNS_TYPE_AAAA :
602
664
sa_set_in6 (& sa , rr -> rdata .aaaa .addr , 0 );
603
665
err |= re_hprintf (pf , "%j" , & sa );
0 commit comments