commit 2eb823b83f4584447c8a42f24164447854d4d813
parent a76d8e744543705a06734fd6e191262a51d700fb
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date: Mon, 29 Jun 2026 12:38:08 +0200
util: Fix data handling in dnsparser
Diffstat:
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/src/lib/util/dnsparser.c b/src/lib/util/dnsparser.c
@@ -225,6 +225,7 @@ GNUNET_DNSPARSER_free_record (struct GNUNET_DNSPARSER_Record *r)
case GNUNET_DNSPARSER_TYPE_NS:
case GNUNET_DNSPARSER_TYPE_CNAME:
+ case GNUNET_DNSPARSER_TYPE_DNAME:
case GNUNET_DNSPARSER_TYPE_PTR:
GNUNET_free (r->data.hostname);
break;
@@ -571,7 +572,7 @@ GNUNET_DNSPARSER_parse_uri (const char *udp_payload,
uri = GNUNET_new (struct GNUNET_DNSPARSER_UriRecord);
uri->priority = ntohs (uri_bin.prio);
uri->weight = ntohs (uri_bin.weight);
- max_len = udp_payload_length - sizeof(struct GNUNET_TUN_DnsUriRecord);
+ max_len = udp_payload_length - *off - sizeof(struct GNUNET_TUN_DnsUriRecord);
len = GNUNET_asprintf (&(uri->target), "%.*s", max_len,
&udp_payload[*off]);
(*off) += len;
@@ -722,7 +723,16 @@ GNUNET_DNSPARSER_parse_record (const char *udp_payload,
return GNUNET_SYSERR;
}
return GNUNET_OK;
-
+ case GNUNET_DNSPARSER_TYPE_CERT:
+ r->data.cert =
+ GNUNET_DNSPARSER_parse_cert (udp_payload,
+ udp_payload_length,
+ off);
+ if ((NULL == r->data.cert) || (old_off + data_len != *off))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_SYSERR;
+ }
default:
r->data.raw.data = GNUNET_malloc (data_len);
r->data.raw.data_len = data_len;
@@ -833,6 +843,7 @@ GNUNET_DNSPARSER_duplicate_record (const struct GNUNET_DNSPARSER_Record *r)
{
case GNUNET_DNSPARSER_TYPE_NS:
case GNUNET_DNSPARSER_TYPE_CNAME:
+ case GNUNET_DNSPARSER_TYPE_DNAME:
case GNUNET_DNSPARSER_TYPE_PTR: {
dup->data.hostname = GNUNET_strdup (r->data.hostname);
break;