From: Damien Miller Date: Tue, 12 May 2026 04:36:27 +0000 (+1000) Subject: update getrrsetbyname.c from OpenBSD upstream X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=67f31cefd8ccf0f55f24e806c4dc86b028fa65ff;p=thirdparty%2Fopenssh-portable.git 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 --- diff --git a/openbsd-compat/getrrsetbyname.c b/openbsd-compat/getrrsetbyname.c index ad35148c9..36e558c2c 100644 --- a/openbsd-compat/getrrsetbyname.c +++ b/openbsd-compat/getrrsetbyname.c @@ -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