summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt2
-rw-r--r--src/common/socket.c19
2 files changed, 19 insertions, 2 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index 9fcbd9ff5..6268f4404 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -1,5 +1,7 @@
Date Added
+2011/09/05
+ * Add consistency checks to the shortlist. [FlavioJS]
2011/09/02
* Fixed @reloadmobdb wiping out monster spawn information. [Skotlex]
2011/08/30
diff --git a/src/common/socket.c b/src/common/socket.c
index 81e5a7bd2..e0f6d9877 100644
--- a/src/common/socket.c
+++ b/src/common/socket.c
@@ -1353,6 +1353,12 @@ void send_shortlist_add_fd(int fd)
if( (send_shortlist_set[i]>>bit)&1 )
return;// already in the list
+ if( send_shortlist_count >= ARRAYLENGTH(send_shortlist_array) )
+ {
+ ShowDebug("send_shortlist_add_fd: shortlist is full, ignoring... (fd=%d shortlist.count=%d shortlist.length=%d)\n", fd, send_shortlist_count, ARRAYLENGTH(send_shortlist_array));
+ return;
+ }
+
// set the bit
send_shortlist_set[i] |= 1<<bit;
// Add to the end of the shortlist array.
@@ -1367,7 +1373,14 @@ void send_shortlist_do_sends()
while( i < send_shortlist_count )
{
int fd = send_shortlist_array[i];
+ int idx = fd/32;
+ int bit = fd%32;
+ 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);
+ }
+ else
// If this session still exists, perform send operations on it and
// check for the eof state.
if( session[fd] )
@@ -1391,8 +1404,10 @@ void send_shortlist_do_sends()
}
// Remove fd from shortlist, move the last fd to the current position
- send_shortlist_array[i] = send_shortlist_array[--send_shortlist_count];
- send_shortlist_set[fd/32]&=~(1<<(fd%32));
+ --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