fix return value of res_send, res_query on errors from nameserver
authorRich Felker <dalias@aerifal.cx>
Tue, 19 May 2020 23:25:42 +0000 (19:25 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 19 May 2020 23:25:42 +0000 (19:25 -0400)
the internal __res_msend returns 0 on timeout without having obtained
any conclusive answer, but in this case has not filled in meaningful
anslen. res_send wrongly treated that as success, but returned a zero
answer length. any reasonable caller would eventually end up treating
that as an error when attempting to parse/validate it, but it should
just be reported as an error.

alternatively we could return the last-received inconclusive answer
(typically servfail), but doing so would require internal changes in
__res_msend. this may be considered later.

src/network/res_send.c

index b9cea0bfd5663de2e5e2bd5aca618eec48f57354..ee4abf1f1ade69273c72ac3c963d038e6a813ffb 100644 (file)
@@ -3,7 +3,7 @@
 int __res_send(const unsigned char *msg, int msglen, unsigned char *answer, int anslen)
 {
        int r = __res_msend(1, &msg, &msglen, &answer, &anslen, anslen);
-       return r<0 ? r : anslen;
+       return r<0 || !anslen ? -1 : anslen;
 }
 
 weak_alias(__res_send, res_send);