From: kp@valhallalegends.com Date: Fri, 4 Jul 2008 18:06:00 +0000 (-0500) Subject: Assert that the client count is positive prior to decrementing it. X-Git-Tag: silc.toolkit.1.1.9~17^2~12 X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=commitdiff_plain;h=590c55bd6febdb6b22ac99b08a0f9c580b09384c Assert that the client count is positive prior to decrementing it. A situation has been observed where a silcd has clients connected to it, but reports 0 local users. It is believed that when these users log off, the server underflows and refuses new connections. Assert that no underflow occurs, which should prove or disprove this theory. --- diff --git a/apps/silcd/packet_receive.c b/apps/silcd/packet_receive.c index 73424a68..06e5bcd9 100644 --- a/apps/silcd/packet_receive.c +++ b/apps/silcd/packet_receive.c @@ -20,6 +20,7 @@ #include "serverincludes.h" #include "server_internal.h" +#include /* Received notify packet. Server can receive notify packets from router. Server then relays the notify messages to clients if needed. */ @@ -326,6 +327,7 @@ static void silc_server_notify_process(SilcServer server, tmp_len = 128; /* Update statistics */ + assert(server->stat.clients > 0); server->stat.clients--; if (server->stat.cell_clients) server->stat.cell_clients--; @@ -1245,6 +1247,7 @@ static void silc_server_notify_process(SilcServer server, } /* Update statistics */ + assert(server->stat.clients > 0); server->stat.clients--; if (server->stat.cell_clients) server->stat.cell_clients--; @@ -1490,6 +1493,7 @@ static void silc_server_notify_process(SilcServer server, } /* Update statistics */ + assert(server->stat.clients > 0); server->stat.clients--; if (server->stat.cell_clients) server->stat.cell_clients--; @@ -3733,6 +3737,7 @@ void silc_server_resume_client(SilcServer server, /* Delete this current client entry since we're resuming to old one. */ server->stat.my_clients--; + assert(server->stat.clients > 0); server->stat.clients--; if (server->stat.cell_clients) server->stat.cell_clients--; diff --git a/apps/silcd/server.c b/apps/silcd/server.c index 05deee4b..5b655419 100644 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@ -19,6 +19,7 @@ #include "serverincludes.h" #include "server_internal.h" +#include /************************* Types and definitions ****************************/ @@ -3133,6 +3134,7 @@ void silc_server_free_client_data(SilcServer server, /* Update statistics */ server->stat.my_clients--; + assert(server->stat.clients > 0); server->stat.clients--; if (server->stat.cell_clients) server->stat.cell_clients--; diff --git a/apps/silcd/server_util.c b/apps/silcd/server_util.c index 74ce18ba..b3cff368 100644 --- a/apps/silcd/server_util.c +++ b/apps/silcd/server_util.c @@ -20,6 +20,7 @@ #include "serverincludes.h" #include "server_internal.h" +#include extern char *server_version; @@ -205,6 +206,7 @@ SilcBool silc_server_remove_clients_by_server(SilcServer server, } /* Update statistics */ + assert(server->stat.clients > 0); server->stat.clients--; if (server->stat.cell_clients) server->stat.cell_clients--; @@ -268,6 +270,7 @@ SilcBool silc_server_remove_clients_by_server(SilcServer server, } /* Update statistics */ + assert(server->stat.clients > 0); server->stat.clients--; if (server->stat.cell_clients) server->stat.cell_clients--; @@ -1560,6 +1563,7 @@ void silc_server_kill_client(SilcServer server, } } else { /* Update statistics */ + assert(server->stat.clients > 0); server->stat.clients--; if (server->stat.cell_clients) server->stat.cell_clients--; diff --git a/lib/silcserver/server_util.c b/lib/silcserver/server_util.c index 6b5b38eb..ef85275c 100644 --- a/lib/silcserver/server_util.c +++ b/lib/silcserver/server_util.c @@ -21,6 +21,7 @@ #include "silc.h" #include "silcserver.h" #include "server_internal.h" +#include /* Return next available command identifier. */