Steinar H. Gunderson fixed: Correctly clear sockets from the fd_set on in
authorDaniel Stenberg <daniel@haxx.se>
Sat, 22 Sep 2007 21:23:10 +0000 (21:23 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Sat, 22 Sep 2007 21:23:10 +0000 (21:23 +0000)
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.

CHANGES
ares_process.c

diff --git a/CHANGES b/CHANGES
index 4f28e3b..a21f1cb 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,11 @@
 
 * September 22 2007 (Daniel Stenberg)
 
+- 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.
+
 - Steinar H. Gunderson modified c-ares to now also do to DNS retries even when
   TCP is used since there are several edge cases where it still makes sense.
 
index 66007f0..082fb4d 100644 (file)
@@ -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;