Commit 0f4664d2 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

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.
parent 0f89a2e6
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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.

+21 −0
Original line number Diff line number Diff line
@@ -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;