dns: handle early eof in tcp fallback
authorAlexey Izbyshev <izbyshev@ispras.ru>
Fri, 24 Feb 2023 20:48:55 +0000 (23:48 +0300)
committerRich Felker <dalias@aerifal.cx>
Mon, 27 Feb 2023 15:03:34 +0000 (10:03 -0500)
A zero returned from recvmsg is currently treated as if some data were
received, so if a DNS server closes its TCP socket before sending the
full answer, __res_msend_rc will spin until the timeout elapses because
POLLIN event will be reported on each poll. Fix this by treating an
early EOF as an error.

src/network/res_msend.c

index fef7e3a..2643be2 100644 (file)
@@ -287,7 +287,7 @@ int __res_msend_rc(int nqueries, const unsigned char *const *queries,
                        };
                        step_mh(&mh, apos[i]);
                        r = recvmsg(pfd[i].fd, &mh, 0);
-                       if (r < 0) goto out;
+                       if (r <= 0) goto out;
                        apos[i] += r;
                        if (apos[i] < 2) continue;
                        int alen = alen_buf[i][0]*256 + alen_buf[i][1];