musl/src/network/res_send.c
Rich Felker e2e9517607 res_send: use a temp buffer if caller's buffer is under 512 bytes
for extremely small buffer sizes, the DNS query core in __res_msend
may malfunction completely, being unable to get even the headers to
determine the response code. but there is also a problem for
reasonable sizes under 512 bytes: __res_msend is unable to determine
if the udp answer was truncated at the recv layer, in which case it
may be incomplete, and res_send is then unable to honor its contract
to return the length of the full, non-truncated answer.

at present, res_send does not honor that contract anyway when the full
answer would exceed 512 bytes, since there is no tcp fallback, but
this change at least makes it consistent in a context where this is
the only "full answer" to be had.
2022-09-22 12:41:23 -04:00

17 lines
446 B
C

#include <resolv.h>
#include <string.h>
int __res_send(const unsigned char *msg, int msglen, unsigned char *answer, int anslen)
{
int r;
if (anslen < 512) {
unsigned char buf[512];
r = __res_send(msg, msglen, buf, sizeof buf);
if (r >= 0) memcpy(answer, buf, r < anslen ? r : anslen);
return r;
}
r = __res_msend(1, &msg, &msglen, &answer, &anslen, anslen);
return r<0 || !anslen ? -1 : anslen;
}
weak_alias(__res_send, res_send);