summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt2
-rw-r--r--src/common/socket.c30
2 files changed, 18 insertions, 14 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index 471500cb3..1449c3df3 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -1,5 +1,7 @@
Date Added
+2011/10/07
+ * Remove fds from the shortlist before processing. [FlavioJS]
2011/09/18
* 14961 Applied map flag update patch provided by Daegaladh. Will mess with custom restricted items.
- Adds a reset mapflag which is checked when using the Neuralizer.
diff --git a/src/common/socket.c b/src/common/socket.c
index e0f6d9877..b522ac607 100644
--- a/src/common/socket.c
+++ b/src/common/socket.c
@@ -1368,19 +1368,30 @@ void send_shortlist_add_fd(int fd)
// Do pending network sends and eof handling from the shortlist.
void send_shortlist_do_sends()
{
- int i = 0;
+ int i;
- while( i < send_shortlist_count )
+ for( i = send_shortlist_count-1; i >= 0; --i )
{
int fd = send_shortlist_array[i];
int idx = fd/32;
int bit = fd%32;
+ // Remove fd from shortlist, move the last fd to the current position
+ --send_shortlist_count;
+ send_shortlist_array[i] = send_shortlist_array[send_shortlist_count];
+ send_shortlist_array[send_shortlist_count] = 0;
+
+ if( fd <= 0 || fd >= FD_SETSIZE )
+ {
+ ShowDebug("send_shortlist_do_sends: fd is out of range, corrupted memory? (fd=%d)\n", fd);
+ continue;
+ }
if( ((send_shortlist_set[idx]>>bit)&1) == 0 )
{
ShowDebug("send_shortlist_do_sends: fd is not set, why is it in the shortlist? (fd=%d)\n", fd);
+ continue;
}
- else
+ send_shortlist_set[idx]&=~(1<<bit);// unset fd
// If this session still exists, perform send operations on it and
// check for the eof state.
if( session[fd] )
@@ -1395,19 +1406,10 @@ void send_shortlist_do_sends()
session[fd]->func_parse(fd);
// If the session still exists, is not eof and has things left to
- // be sent from it we'll keep it in the shortlist.
+ // be sent from it we'll re-add it to the shortlist.
if( session[fd] && !session[fd]->flag.eof && session[fd]->wdata_size )
- {
- ++i;
- continue;
- }
+ send_shortlist_add_fd(fd);
}
-
- // Remove fd from shortlist, move the last fd to the current position
- --send_shortlist_count;
- send_shortlist_array[i] = send_shortlist_array[send_shortlist_count];
- send_shortlist_array[send_shortlist_count] = 0;
- send_shortlist_set[idx]&=~(1<<bit);
}
}
#endif