mirror of
https://github.com/curl/curl.git
synced 2024-11-21 01:16:58 +08:00
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.
This commit is contained in:
parent
0f89a2e639
commit
0f4664d27f
@ -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.
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user