diff options
Diffstat (limited to 'src/network/res_msend.c')
-rw-r--r-- | src/network/res_msend.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/network/res_msend.c b/src/network/res_msend.c index 1e76886a..11c6aa0e 100644 --- a/src/network/res_msend.c +++ b/src/network/res_msend.c @@ -194,9 +194,18 @@ int __res_msend_rc(int nqueries, const unsigned char *const *queries, /* Wait for a response, or until time to retry */ if (poll(pfd, nqueries+1, t1+retry_interval-t2) <= 0) continue; - while (next < nqueries && - (rlen = recvfrom(fd, answers[next], asize, 0, - (void *)&sa, (socklen_t[1]){sl})) >= 0) { + while (next < nqueries) { + struct msghdr mh = { + .msg_name = (void *)&sa, + .msg_namelen = sl, + .msg_iovlen = 1, + .msg_iov = (struct iovec []){ + { .iov_base = (void *)answers[next], + .iov_len = asize } + } + }; + rlen = recvmsg(fd, &mh, 0); + if (rlen < 0) break; /* Ignore non-identifiable packets */ if (rlen < 4) continue; @@ -240,7 +249,7 @@ int __res_msend_rc(int nqueries, const unsigned char *const *queries, if (next == nqueries) pfd[nqueries].events = 0; /* If answer is truncated (TC bit), fallback to TCP */ - if (answers[i][2] & 2) { + if ((answers[i][2] & 2) || (mh.msg_flags & MSG_TRUNC)) { alens[i] = -1; pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, 0); r = start_tcp(pfd+i, family, ns+j, sl, queries[i], qlens[i]); |