diff options
author | Rich Felker <dalias@aerifal.cx> | 2020-05-19 19:25:42 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2020-05-19 19:25:42 -0400 |
commit | 1b4e84c56df0f8ca30f6bc05962a860f869e71df (patch) | |
tree | b0f6cb873b88d8546f77653f57cc3ab2bb887a49 /src/network | |
parent | 5cf1ac2443ad0dba263559a3fe043d929e0e5c4c (diff) | |
download | musl-1b4e84c56df0f8ca30f6bc05962a860f869e71df.tar.gz musl-1b4e84c56df0f8ca30f6bc05962a860f869e71df.tar.bz2 musl-1b4e84c56df0f8ca30f6bc05962a860f869e71df.tar.xz musl-1b4e84c56df0f8ca30f6bc05962a860f869e71df.zip |
fix return value of res_send, res_query on errors from nameserver
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.
Diffstat (limited to 'src/network')
-rw-r--r-- | src/network/res_send.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/src/network/res_send.c b/src/network/res_send.c index b9cea0bf..ee4abf1f 100644 --- a/src/network/res_send.c +++ b/src/network/res_send.c @@ -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); |