diff options
-rw-r--r-- | Changelog-Trunk.txt | 1 | ||||
-rw-r--r-- | src/common/socket.c | 26 |
2 files changed, 20 insertions, 7 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index e48269deb..cc065aec6 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -4,6 +4,7 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. 2006/12/28 + * Reapplied Skotlex's socket.c changes from r9587 and r9582. :S * Part 3 of TheUltraMage's socket cleanup. * Fixed the packet structure in mmo_char_send006b for PACKETVER 8. * Removed search_str from add_str (add_str already searches for the diff --git a/src/common/socket.c b/src/common/socket.c index 81411808e..c9e282997 100644 --- a/src/common/socket.c +++ b/src/common/socket.c @@ -633,7 +633,13 @@ int do_sendrecv(int next) for(i = 1; i < fd_max; i++) { if(!session[i]) + { + if (FD_ISSET(i, &readfds)) { + ShowError("Deleting non-cleared session %d\n", i); + FD_CLR(i, &readfds); + } continue; + } //check the validity of the socket. Does what the last thing did //just alot faster [Meruru] @@ -641,14 +647,19 @@ int do_sendrecv(int next) if(getsockname(i,(struct sockaddr*)&addr_check,&size)<0) if(s_errno == S_ENOTSOCK) { + ShowError("Deleting invalid session %d\n", i); + //So the code can react accordingly + session[i]->eof = 1; + if(session[i]->func_parse) + session[i]->func_parse(i); free_session_mem(i); //free the bad session continue; } - - FD_SET(i,&readfds); + + if (!FD_ISSET(i, &readfds)) + FD_SET(i,&readfds); ret = i; } - fd_max = ret; } @@ -664,8 +675,10 @@ int do_sendrecv(int next) session[rfd.fd_array[i]]->func_recv) session[rfd.fd_array[i]]->func_recv(rfd.fd_array[i]); } - for(i=0;i<(int)efd.fd_count;i++) + for(i=0;i<(int)efd.fd_count;i++) { + ShowDebug("do_sendrecv: Connection error on Session %d.\n", efd.fd_array[i]); set_eof(efd.fd_array[i]); + } for (i = 1; i < fd_max; i++) { @@ -679,7 +692,7 @@ int do_sendrecv(int next) if(session[i]->wdata_size && session[i]->func_send) session[i]->func_send(i); - if(session[i] && session[i]->eof) //The session check is for when the connection ended in func_parse + if(session[i]->eof) //func_send can't free a session, this is safe. { //Finally, even if there is no data to parse, connections signalled eof should be closed, so we call parse_func [Skotlex] if (session[i]->func_parse) session[i]->func_parse(i); //This should close the session inmediately. @@ -699,7 +712,6 @@ int do_sendrecv(int next) continue; } - if(FD_ISSET(i,&rfd)){ //ShowMessage("read:%d\n",i); if(session[i]->func_recv) @@ -711,7 +723,7 @@ int do_sendrecv(int next) if(session[i]->wdata_size && session[i]->func_send) session[i]->func_send(i); - if(session[i] && session[i]->eof) //The session check is for when the connection ended in func_parse + if(session[i]->eof) { //Finally, even if there is no data to parse, connections signalled eof should be closed, so we call parse_func [Skotlex] if (session[i]->func_parse) session[i]->func_parse(i); //This should close the session inmediately. |