]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
update getrrsetbyname.c from OpenBSD upstream
authorDamien Miller <djm@mindrot.org>
Tue, 12 May 2026 04:36:27 +0000 (14:36 +1000)
committerDamien Miller <djm@mindrot.org>
Tue, 12 May 2026 04:36:27 +0000 (14:36 +1000)
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

openbsd-compat/getrrsetbyname.c

index ad35148c929869bec986bb402cfe214062359395..36e558c2c624e1004ed486595d8a11b5606ae7eb 100644 (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