aboutsummaryrefslogtreecommitdiff
path: root/ares/ares_process.c
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2007-09-22 21:23:10 +0000
committerDaniel Stenberg <daniel@haxx.se>2007-09-22 21:23:10 +0000
commit0f4664d27f67c7f0597b08acd59433d6cf1a40c2 (patch)
tree2e9ae616a7be6b9bb2d8ce4a8f60729c239a8f2c /ares/ares_process.c
parent0f89a2e639f002df48bd43726818410439e24dd4 (diff)
Steinar H. Gunderson fixed: Correctly clear sockets from the fd_set on in
several functions (write_tcp_data, read_tcp_data, read_udp_packets) so that if it fails and the socket is closed the following code doesn't try to use the file descriptor.
Diffstat (limited to 'ares/ares_process.c')
-rw-r--r--ares/ares_process.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/ares/ares_process.c b/ares/ares_process.c
index 66007f0fb..082fb4d84 100644
--- a/ares/ares_process.c
+++ b/ares/ares_process.c
@@ -167,6 +167,13 @@ static void write_tcp_data(ares_channel channel,
continue;
}
+ /* If there's an error and we close this socket, then open
+ * another with the same fd to talk to another server, then we
+ * don't want to think that it was the new socket that was
+ * ready. This is not disastrous, but is likely to result in
+ * extra system calls and confusion. */
+ FD_CLR(server->tcp_socket, write_fds);
+
/* Count the number of send queue items. */
n = 0;
for (sendreq = server->qhead; sendreq; sendreq = sendreq->next)
@@ -280,6 +287,13 @@ static void read_tcp_data(ares_channel channel, fd_set *read_fds,
continue;
}
+ /* If there's an error and we close this socket, then open
+ * another with the same fd to talk to another server, then we
+ * don't want to think that it was the new socket that was
+ * ready. This is not disastrous, but is likely to result in
+ * extra system calls and confusion. */
+ FD_CLR(server->tcp_socket, read_fds);
+
if (server->tcp_lenbuf_pos != 2)
{
/* We haven't yet read a length word, so read that (or
@@ -370,6 +384,13 @@ static void read_udp_packets(ares_channel channel, fd_set *read_fds,
continue;
}
+ /* If there's an error and we close this socket, then open
+ * another with the same fd to talk to another server, then we
+ * don't want to think that it was the new socket that was
+ * ready. This is not disastrous, but is likely to result in
+ * extra system calls and confusion. */
+ FD_CLR(server->udp_socket, read_fds);
+
count = sread(server->udp_socket, buf, sizeof(buf));
if (count == -1 && try_again(SOCKERRNO))
continue;