update getrrsetbyname.c from OpenBSD upstream

revision 1.15
date: 2026/05/09 01:54:51;  author: tb;  state: Exp;  lines: +14 -13;  commitid: zZPVUWycKAslGJtO;
Avoid recursive cleanup in getrrsetbyname()

Instead of freeing struct dns_query and struct dns_rr by walking the
linked lists recursively, use a simple loop. This avoids a possible
stack exhaustion unlikely to be reachable with the limits modern
resolvers impose.

From Dhiraj Mishra
This commit is contained in:
Damien Miller committed 2026-05-12 14:36:27 +10:00
1 parent 56e73cd804
commit 67f31cefd8
1 file changed
+12 -11
+12 -11
View File
@@ -595,27 +595,28 @@ parse_dns_rrsection(const u_char *answer, int size, const u_char **cp,
static void
free_dns_query(struct dns_query *p)
{
if (p == NULL)
return;
struct dns_query *next;
if (p->name)
while (p != NULL) {
next = p->next;
free(p->name);
free_dns_query(p->next);
free(p);
free(p);
p = next;
}
}
static void
free_dns_rr(struct dns_rr *p)
{
if (p == NULL)
return;
struct dns_rr *next;
if (p->name)
while (p != NULL) {
next = p->next;
free(p->name);
if (p->rdata)
free(p->rdata);
free_dns_rr(p->next);
free(p);
free(p);
p = next;
}
}
static void