From 494ef1674334bfb3b4b574cb24d447bc4e7986ab Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 10 Dec 2022 10:21:41 +0900 Subject: [PATCH 1/3] resolve: drop recursion in TXT field handling Fixes #25683. --- src/resolve/resolved-dns-rr.c | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/src/resolve/resolved-dns-rr.c b/src/resolve/resolved-dns-rr.c index a4ba6bdc6d..5f890f9509 100644 --- a/src/resolve/resolved-dns-rr.c +++ b/src/resolve/resolved-dns-rr.c @@ -1768,36 +1768,30 @@ int dns_resource_record_get_cname_target(DnsResourceKey *key, DnsResourceRecord return 0; } -DnsTxtItem *dns_txt_item_free_all(DnsTxtItem *i) { - DnsTxtItem *n; +DnsTxtItem *dns_txt_item_free_all(DnsTxtItem *first) { + LIST_FOREACH(items, i, first) + free(i); - if (!i) - return NULL; - - n = i->items_next; - - free(i); - return dns_txt_item_free_all(n); + return NULL; } bool dns_txt_item_equal(DnsTxtItem *a, DnsTxtItem *b) { + DnsTxtItem *bb = b; if (a == b) return true; - if (!a != !b) - return false; + LIST_FOREACH(items, aa, a) { + if (!bb) + return false; - if (!a) - return true; + if (memcmp_nn(aa->data, aa->length, bb->data, bb->length) != 0) + return false; - if (a->length != b->length) - return false; + bb = bb->items_next; + } - if (memcmp(a->data, b->data, a->length) != 0) - return false; - - return dns_txt_item_equal(a->items_next, b->items_next); + return !bb; } DnsTxtItem *dns_txt_item_copy(DnsTxtItem *first) { From 14822ede9f2c25ab93d7fceaa5f044804d24cfe8 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 10 Dec 2022 10:25:38 +0900 Subject: [PATCH 2/3] resolve: shorten code a bit --- src/resolve/resolved-dns-rr.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/resolve/resolved-dns-rr.c b/src/resolve/resolved-dns-rr.c index 5f890f9509..ce9cecf118 100644 --- a/src/resolve/resolved-dns-rr.c +++ b/src/resolve/resolved-dns-rr.c @@ -1801,10 +1801,8 @@ DnsTxtItem *dns_txt_item_copy(DnsTxtItem *first) { DnsTxtItem *j; j = memdup(i, offsetof(DnsTxtItem, data) + i->length + 1); - if (!j) { - dns_txt_item_free_all(copy); - return NULL; - } + if (!j) + return dns_txt_item_free_all(copy); LIST_INSERT_AFTER(items, copy, end, j); end = j; From 068ef623bd2b9c7b39f0a021f5182700c0133ff1 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 10 Dec 2022 10:25:53 +0900 Subject: [PATCH 3/3] resolve: add missing assertion --- src/resolve/resolved-dns-rr.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/resolve/resolved-dns-rr.c b/src/resolve/resolved-dns-rr.c index ce9cecf118..d3175b1b9d 100644 --- a/src/resolve/resolved-dns-rr.c +++ b/src/resolve/resolved-dns-rr.c @@ -1814,6 +1814,8 @@ DnsTxtItem *dns_txt_item_copy(DnsTxtItem *first) { int dns_txt_item_new_empty(DnsTxtItem **ret) { DnsTxtItem *i; + assert(ret); + /* RFC 6763, section 6.1 suggests to treat * empty TXT RRs as equivalent to a TXT record * with a single empty string. */ @@ -1823,7 +1825,6 @@ int dns_txt_item_new_empty(DnsTxtItem **ret) { return -ENOMEM; *ret = i; - return 0; }