From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2155) id F3BE03857817; Wed, 19 Jan 2022 07:55:42 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org F3BE03857817 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Corinna Vinschen To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin] Cygwin: resolver: Fix to match response ID with request ID X-Act-Checkin: newlib-cygwin X-Git-Author: Anton Lavrentiev via Cygwin-patches X-Git-Refname: refs/heads/master X-Git-Oldrev: 12bf36f72b7e6019a3adb60d86e65262f43a9311 X-Git-Newrev: 905f51d7978e09b8f21d7442c58751fdf775c637 Message-Id: <20220119075542.F3BE03857817@sourceware.org> Date: Wed, 19 Jan 2022 07:55:42 +0000 (GMT) X-BeenThere: cygwin-cvs@cygwin.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Cygwin core component git logs List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 19 Jan 2022 07:55:43 -0000 https://sourceware.org/git/gitweb.cgi?p=3Dnewlib-cygwin.git;h=3D905f51d7978= e09b8f21d7442c58751fdf775c637 commit 905f51d7978e09b8f21d7442c58751fdf775c637 Author: Anton Lavrentiev via Cygwin-patches Date: Tue Jan 18 17:39:15 2022 -0500 Cygwin: resolver: Fix to match response ID with request ID =20 In case when the native OS resolver is used (via os_query) the returned response ID is always 0. It should actually match the ID passed in to res_send() in the DNS request header. This patch fixes that Diff: --- winsup/cygwin/libc/minires-os-if.c | 6 +++++- winsup/cygwin/libc/minires.c | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/winsup/cygwin/libc/minires-os-if.c b/winsup/cygwin/libc/minire= s-os-if.c index c4183db9c..8d3178f70 100644 --- a/winsup/cygwin/libc/minires-os-if.c +++ b/winsup/cygwin/libc/minires-os-if.c @@ -189,10 +189,14 @@ static int cygwin_query(res_state statp, const char *= DomName, int Class, int Ty DWORD section; int len, counts[4] =3D {0, 0, 0, 0}, debug =3D statp->options & RES_DEBU= G; unsigned char * dnptrs[256], * ptr; + unsigned short Id =3D 0; =20 dnptrs[0] =3D AnsPtr; dnptrs[1] =3D NULL; =20 + if (AnsLength >=3D 2) + memcpy(&Id, AnsPtr, 2); + memset(AnsPtr, 0, AnsLength); =20 if (Class !=3D ns_c_in) { @@ -294,7 +298,7 @@ static int cygwin_query(res_state statp, const char * D= omName, int Class, int Ty done: if (HFIXEDSZ <=3D AnsLength) { ptr =3D AnsPtr; - PUTSHORT(0, ptr); /* Id */ + PUTSHORT(Id, ptr); PUTSHORT((QR << 8) + RA + RD, ptr); for (section =3D 0; section < DIM(counts); section++) { PUTSHORT(counts[section], ptr); diff --git a/winsup/cygwin/libc/minires.c b/winsup/cygwin/libc/minires.c index fdc6087f5..b540f6a1b 100644 --- a/winsup/cygwin/libc/minires.c +++ b/winsup/cygwin/libc/minires.c @@ -450,6 +450,8 @@ int res_nsend( res_state statp, const unsigned char * M= sgPtr, ptr +=3D len; GETSHORT(Type, ptr); GETSHORT(Class, ptr); + if (AnsLength >=3D 2) + memcpy(AnsPtr, MsgPtr, 2); return ((os_query_t *) statp->os_query)(statp, DomName, Class, Type,= AnsPtr, AnsLength); } else { @@ -709,8 +711,11 @@ int res_nquery( res_state statp, const char * DomName,= int Class, int Type, statp->res_h_errno =3D NETDB_SUCCESS; =20 /* If a hook exists to a native implementation, use it */ - if (statp->os_query) + if (statp->os_query) { + if (AnsLength >=3D 2) + memset(AnsPtr, 0/*Id*/, 2); return ((os_query_t *) statp->os_query)(statp, DomName, Class, Type, A= nsPtr, AnsLength); + } =20 if ((len =3D res_nmkquery (statp, QUERY, DomName, Class, Type, 0, 0, 0, packet, PACKETSZ)) < 0)