diff options
author | Daniel Stenberg <daniel@haxx.se> | 2006-10-12 16:47:50 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2006-10-12 16:47:50 +0000 |
commit | 47ea80baeee0244e016293c3363b5f4827a85eae (patch) | |
tree | 5553cfbf80186e0fb86ed22bcbdad20e1f5a1fe0 /ares | |
parent | 95c3fa836b50f1b83bdc325c108cf220673c99e4 (diff) |
avoid an overflow if an excessive amount of servers are used
Diffstat (limited to 'ares')
-rw-r--r-- | ares/ares_getsock.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/ares/ares_getsock.c b/ares/ares_getsock.c index 55f4c9dda..a6288e986 100644 --- a/ares/ares_getsock.c +++ b/ares/ares_getsock.c @@ -1,6 +1,6 @@ /* $Id$ */ -/* Copyright 2005 by Daniel Stenberg. +/* Copyright (C) 2005 - 2006, Daniel Stenberg * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided @@ -39,7 +39,9 @@ int ares_getsock(ares_channel channel, if (!channel->queries) return 0; - for (i = 0; i < channel->nservers; i++) + for (i = 0; + (i < channel->nservers) && (sockindex < ARES_GETSOCK_MAXNUM); + i++) { server = &channel->servers[i]; if (server->udp_socket != ARES_SOCKET_BAD) @@ -56,13 +58,12 @@ int ares_getsock(ares_channel channel, break; socks[sockindex] = server->tcp_socket; bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex); - sockindex++; - if (server->qhead) { + if (server->qhead) /* then the tcp socket is also writable! */ - bitmap |= ARES_GETSOCK_WRITABLE(setbits, sockindex-1); - } + bitmap |= ARES_GETSOCK_WRITABLE(setbits, sockindex); + sockindex++; } } return bitmap; |