mirror of
https://github.com/openssh/openssh-portable.git
synced 2026-11-06 05:16:43 +00:00
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:
1 file changed
+12
-11
@@ -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
|
||||
|
||||
Reference in new issue
Block a user