From 12bf36f72b7e6019a3adb60d86e65262f43a9311 Mon Sep 17 00:00:00 2001 From: Anton Lavrentiev via Cygwin-patches Date: Tue, 18 Jan 2022 16:34:34 -0500 Subject: [PATCH] Cygwin: resolver: A few fixes for cygwin_query() - Make sure the answer buffer is properly cleared so there is no trailing garbage when the response does not fit entirely in; - Make sure an internal decomp failure gets reported correctly (w/return code -1); - Make sure that the buffer is not overrun when filling out the header. --- winsup/cygwin/libc/minires-os-if.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/winsup/cygwin/libc/minires-os-if.c b/winsup/cygwin/libc/minires-os-if.c index bb6786f6c..c4183db9c 100644 --- a/winsup/cygwin/libc/minires-os-if.c +++ b/winsup/cygwin/libc/minires-os-if.c @@ -193,6 +193,8 @@ static int cygwin_query(res_state statp, const char * DomName, int Class, int Ty dnptrs[0] = AnsPtr; dnptrs[1] = NULL; + memset(AnsPtr, 0, AnsLength); + if (Class != ns_c_in) { errno = ENOSYS; statp->res_h_errno = NETDB_INTERNAL; @@ -214,7 +216,7 @@ static int cygwin_query(res_state statp, const char * DomName, int Class, int Ty switch (res) { case ERROR_INVALID_NAME: errno = EINVAL; - statp->res_h_errno = NETDB_INTERNAL;; + statp->res_h_errno = NETDB_INTERNAL; break; case ERROR_TIMEOUT: statp->res_h_errno = TRY_AGAIN; @@ -259,8 +261,9 @@ static int cygwin_query(res_state statp, const char * DomName, int Class, int Ty /* No question. Adopt the first name as the name in the question */ if ((len = dn_comp(rr->pName, ptr, AnsLength - 4, dnptrs, &dnptrs[DIM(dnptrs) - 1])) < 0) { - ptr = NULL; - break; + statp->res_h_errno = NETDB_INTERNAL; /* dn_comp sets errno */ + len = -1; + goto done; } ptr += len; PUTSHORT(Type, ptr); @@ -289,11 +292,13 @@ static int cygwin_query(res_state statp, const char * DomName, int Class, int Ty len = ptr - AnsPtr; done: - ptr = AnsPtr; - PUTSHORT(0, ptr); /* Id */ - PUTSHORT((QR << 8) + RA + RD, ptr); - for (section = 0; section < DIM(counts); section++) { - PUTSHORT(counts[section], ptr); + if (HFIXEDSZ <= AnsLength) { + ptr = AnsPtr; + PUTSHORT(0, ptr); /* Id */ + PUTSHORT((QR << 8) + RA + RD, ptr); + for (section = 0; section < DIM(counts); section++) { + PUTSHORT(counts[section], ptr); + } } return len; } -- 2.43.5