Make sure client entry is not expired more than once
authorPekka Riikonen <priikone@silcnet.org>
Sun, 22 Jun 2008 08:03:58 +0000 (11:03 +0300)
committerPekka Riikonen <priikone@silcnet.org>
Sun, 22 Jun 2008 08:03:58 +0000 (11:03 +0300)
apps/silcd/command_reply.c
apps/silcd/idlist.c
apps/silcd/packet_receive.c
apps/silcd/server.c
apps/silcd/server_util.c

index 36eb1368497914f62fe0e3623ee9276aa6f71b08..d7202f2714344505b3ff27a4bdcf2ea461c9c959 100644 (file)
@@ -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->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 :
 
     /* 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) {
   /* 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);
       silc_dlist_add(server->expired_clients, client);
+    }
   }
 
   return TRUE;
   }
 
   return TRUE;
index e4dbfbd6077e69c152deb88cf4b8a4a839c0f30e..1c75d7181bf0b8a73af4a9ed3c5562771a8ec2eb 100644 (file)
@@ -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));
     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;
       return NULL;
     if (!silc_identifier_verify(u, strlen(u), SILC_STRING_UTF8, 128))
       return NULL;
index 786c21a088fd52a8b1896ba385d664b1063dedbe..c8d4068d765b444754a4dc29c7301099d95cca14 100644 (file)
@@ -356,6 +356,7 @@ static void silc_server_notify_process(SilcServer server,
     client->mode = 0;
     client->router = NULL;
     client->connection = NULL;
     client->mode = 0;
     client->router = NULL;
     client->connection = NULL;
+    silc_dlist_del(server->expired_clients, client);
     silc_dlist_add(server->expired_clients, client);
     break;
 
     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;
       client->mode = 0;
       client->router = NULL;
       client->connection = NULL;
+      silc_dlist_del(server->expired_clients, client);
       silc_dlist_add(server->expired_clients, client);
       break;
     }
       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);
     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)
 
     /* Check if anyone is watching this client */
     if (server->server_type == SILC_ROUTER)
index 73f363613f1a24ae59237900b29a411248142b12..aff2df5c1aeb8e710d0f852ea536cf2542d677b4 100644 (file)
@@ -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))) {
 
   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. */
     /* 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 ?
       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();
     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 */
     silc_dlist_add(server->expired_clients, client);
   } else {
     /* Delete directly since we're shutting down server */
index 14a1a240c9bfa62fbdeabf70dfbf66500ce332b0..274bd0f58b483bbefbbe4bd2baf06740056f30f3 100644 (file)
@@ -228,6 +228,7 @@ SilcBool silc_server_remove_clients_by_server(SilcServer server,
        client->mode = 0;
        client->router = NULL;
        client->connection = NULL;
        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);
        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;
        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);
        silc_dlist_add(server->expired_clients, client);
       } else {
        silc_idlist_del_data(client);