updates.
[silc.git] / lib / silcclient / idlist.c
index 9141372c26f46d93883183041680aefca810e8e1..da646b52255a2f6c3ccd2e7f7cd1d9eb1caea6df 100644 (file)
@@ -20,6 +20,7 @@
 /* $Id$ */
 
 #include "clientlibincludes.h"
+#include "client_internal.h"
 
 typedef struct {
   SilcClientCommandContext cmd;
@@ -215,8 +216,10 @@ SILC_CLIENT_CMD_FUNC(get_clients_list_callback)
     SILC_GET16_MSB(idp_len, client_id_list->data + 2);
     idp_len += 4;
     client_id = silc_id_payload_parse_id(client_id_list->data, idp_len);
-    if (!client_id)
+    if (!client_id) {
+      silc_buffer_pull(client_id_list, idp_len);
       continue;
+    }
 
     /* Get the client entry */
     if (silc_idcache_find_by_id_one_ext(i->conn->client_cache, 
@@ -294,8 +297,10 @@ void silc_client_get_clients_by_list(SilcClient client,
     SILC_GET16_MSB(idp_len, client_id_list->data + 2);
     idp_len += 4;
     client_id = silc_id_payload_parse_id(client_id_list->data, idp_len);
-    if (!client_id)
+    if (!client_id) {
+      silc_buffer_pull(client_id_list, idp_len);
       continue;
+    }
 
     /* Check if we have this client cached already. */
     id_cache = NULL;
@@ -582,7 +587,7 @@ silc_client_add_client(SilcClient client, SilcClientConnection conn,
   
   /* Add client to cache, the non-formatted nickname is saved to cache */
   if (!silc_idcache_add(conn->client_cache, nick, client_entry->id, 
-                       (void *)client_entry, FALSE)) {
+                       (void *)client_entry, 0, NULL)) {
     silc_free(client_entry->nickname);
     silc_free(client_entry->username);
     silc_free(client_entry->hostname);
@@ -624,13 +629,14 @@ void silc_client_update_client(SilcClient client,
     /* Remove the old cache entry and create a new one */
     silc_idcache_del_by_context(conn->client_cache, client_entry);
     silc_idcache_add(conn->client_cache, nick, client_entry->id, 
-                    client_entry, FALSE);
+                    client_entry, 0, NULL);
   }
 }
 
 /* Deletes the client entry and frees all memory. */
 
 void silc_client_del_client_entry(SilcClient client, 
+                                 SilcClientConnection conn,
                                  SilcClientEntry client_entry)
 {
   SILC_LOG_DEBUG(("Start"));
@@ -640,11 +646,15 @@ void silc_client_del_client_entry(SilcClient client,
   silc_free(client_entry->realname);
   silc_free(client_entry->server);
   silc_free(client_entry->id);
+  silc_free(client_entry->fingerprint);
   if (client_entry->send_key)
     silc_cipher_free(client_entry->send_key);
   if (client_entry->receive_key)
     silc_cipher_free(client_entry->receive_key);
   silc_free(client_entry->key);
+  silc_client_ftp_session_free_client(conn, client_entry);
+  if (client_entry->ke)
+    silc_client_abort_key_agreement(client, conn, client_entry);
   silc_free(client_entry);
 }
 
@@ -654,7 +664,7 @@ bool silc_client_del_client(SilcClient client, SilcClientConnection conn,
                            SilcClientEntry client_entry)
 {
   bool ret = silc_idcache_del_by_context(conn->client_cache, client_entry);
-  silc_client_del_client_entry(client, client_entry);
+  silc_client_del_client_entry(client, conn, client_entry);
   return ret;
 }
 
@@ -909,7 +919,7 @@ void silc_client_nickname_format(SilcClient client,
 
   len = 0;
   for (i = 0; i < clients_count; i++)
-    if (clients[i]->valid)
+    if (clients[i]->valid && clients[i] != client_entry)
       len++;
   if (!len)
     return;