From a939f27e19b8084ef2acd25156b19d26d1440ace Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Sun, 22 Jun 2008 11:03:58 +0300 Subject: [PATCH] Make sure client entry is not expired more than once --- apps/silcd/command_reply.c | 9 ++++++--- apps/silcd/idlist.c | 2 +- apps/silcd/packet_receive.c | 3 +++ apps/silcd/server.c | 6 ++---- apps/silcd/server_util.c | 2 ++ 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/apps/silcd/command_reply.c b/apps/silcd/command_reply.c index 36eb1368..d7202f27 100644 --- a/apps/silcd/command_reply.c +++ b/apps/silcd/command_reply.c @@ -533,6 +533,7 @@ silc_server_command_reply_whowas_save(SilcServerCommandReplyContext cmd) client->servername = servername[0] ? strdup(servername) : NULL; client->data.status |= SILC_IDLIST_STATUS_RESOLVED; client->data.status &= ~SILC_IDLIST_STATUS_RESOLVING; + client->data.status &= ~SILC_IDLIST_STATUS_REGISTERED; /* Update cache entry */ silc_idcache_update_by_context(global ? server->global_list->clients : @@ -543,10 +544,12 @@ silc_server_command_reply_whowas_save(SilcServerCommandReplyContext cmd) /* If client is global and is not on any channel then add that we'll expire the entry after a while. */ if (global) { - silc_idlist_find_client_by_id(server->global_list, client->id, - FALSE, &cache); - if (!silc_hash_table_count(client->channels)) + client = silc_idlist_find_client_by_id(server->global_list, client->id, + FALSE, &cache); + if (client && !silc_hash_table_count(client->channels)) { + silc_dlist_del(server->expired_clients, client); silc_dlist_add(server->expired_clients, client); + } } return TRUE; diff --git a/apps/silcd/idlist.c b/apps/silcd/idlist.c index e4dbfbd6..1c75d718 100644 --- a/apps/silcd/idlist.c +++ b/apps/silcd/idlist.c @@ -326,7 +326,7 @@ silc_idlist_add_client(SilcIDList id_list, char *nickname, char *username, int ret; ret = silc_parse_userfqdn(username, u, sizeof(u), h, sizeof(h)); - if (!u) + if (!ret) return NULL; if (!silc_identifier_verify(u, strlen(u), SILC_STRING_UTF8, 128)) return NULL; diff --git a/apps/silcd/packet_receive.c b/apps/silcd/packet_receive.c index 786c21a0..c8d4068d 100644 --- a/apps/silcd/packet_receive.c +++ b/apps/silcd/packet_receive.c @@ -356,6 +356,7 @@ static void silc_server_notify_process(SilcServer server, client->mode = 0; client->router = NULL; client->connection = NULL; + silc_dlist_del(server->expired_clients, client); silc_dlist_add(server->expired_clients, client); break; @@ -1504,6 +1505,7 @@ static void silc_server_notify_process(SilcServer server, client->mode = 0; client->router = NULL; client->connection = NULL; + silc_dlist_del(server->expired_clients, client); silc_dlist_add(server->expired_clients, client); break; } @@ -3951,6 +3953,7 @@ void silc_server_resume_client(SilcServer server, detached_client->data.status |= SILC_IDLIST_STATUS_RESUMED; detached_client->data.status &= ~SILC_IDLIST_STATUS_LOCAL; silc_dlist_del(server->expired_clients, detached_client); + silc_dlist_del(server->expired_clients, detached_client); /* Check if anyone is watching this client */ if (server->server_type == SILC_ROUTER) diff --git a/apps/silcd/server.c b/apps/silcd/server.c index 73f36361..aff2df5c 100644 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@ -1263,13 +1263,10 @@ SILC_TASK_CALLBACK(silc_server_purge_expired_clients) silc_dlist_start(server->expired_clients); while ((client = silc_dlist_get(server->expired_clients))) { - if (client->data.status & SILC_IDLIST_STATUS_REGISTERED) - continue; - /* For unregistered clients the created timestamp is actually unregistered timestamp. Make sure client remains in history at least 500 seconds. */ - if (curtime - client->data.created < 500) + if (client->data.created && curtime - client->data.created < 500) continue; id_list = (client->data.status & SILC_IDLIST_STATUS_LOCAL ? @@ -3036,6 +3033,7 @@ void silc_server_free_client_data(SilcServer server, client->router = NULL; client->connection = NULL; client->data.created = silc_time(); + silc_dlist_del(server->expired_clients, client); silc_dlist_add(server->expired_clients, client); } else { /* Delete directly since we're shutting down server */ diff --git a/apps/silcd/server_util.c b/apps/silcd/server_util.c index 14a1a240..274bd0f5 100644 --- a/apps/silcd/server_util.c +++ b/apps/silcd/server_util.c @@ -228,6 +228,7 @@ SilcBool silc_server_remove_clients_by_server(SilcServer server, client->mode = 0; client->router = NULL; client->connection = NULL; + silc_dlist_del(server->expired_clients, client); silc_dlist_add(server->expired_clients, client); } else { silc_idlist_del_data(client); @@ -289,6 +290,7 @@ SilcBool silc_server_remove_clients_by_server(SilcServer server, client->mode = 0; client->router = NULL; client->connection = NULL; + silc_dlist_del(server->expired_clients, client); silc_dlist_add(server->expired_clients, client); } else { silc_idlist_del_data(client); -- 2.24.0