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.
This commit is contained in:
Anton Lavrentiev via Cygwin-patches 2022-01-18 16:34:34 -05:00 committed by Corinna Vinschen
parent fa279a583d
commit 12bf36f72b
1 changed files with 13 additions and 8 deletions

View File

@ -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;
}