Fixed connection freeing to not crash in disconnection.
authorPekka Riikonen <priikone@silcnet.org>
Sat, 2 Nov 2002 10:55:21 +0000 (10:55 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Sat, 2 Nov 2002 10:55:21 +0000 (10:55 +0000)
CHANGES
TODO
lib/silcclient/client.c

diff --git a/CHANGES b/CHANGES
index a482f5aa66b5541e24d081b045e29d97be91e3e2..19e6d29b0ea716a356b421bd7368d7d97a2a1186 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,10 @@
+Sat Nov  2 12:53:09 EET 2002  Pekka Riikonen <priikone@silcnet.org>
+
+       * Fixed connection closing in client library to not crash.
+         Moved the connection freeing totally to function
+         silc_clinet_del_connection.  Affected file 
+         lib/silcclinet/client.c.
+
 Fri Nov  1 18:57:02 EET 2002  Pekka Riikonen <priikone@silcnet.org>
 
        * Changed includes/silcincludes.h to silcincludes.h.in to
diff --git a/TODO b/TODO
index bb4c0761da0a7168b7a9f48a31f97aabb44fece1..2e5e405946170c4ddb51c2e87930b2987e706160 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,4 +1,4 @@
-TODO/bugs in Irssi SILC Client
+TODO for Irssi SILC Client 1.0
 ==============================
 
  o bugs parsing nicknames with @ in NICK_CHANGE.
@@ -16,7 +16,7 @@ TODO/bugs in Irssi SILC Client
      http://silcnet.org/docs/silc-client-1.0-test.ps
 
 
-TODO/bugs In SILC Server
+TODO for SILC Server 1.0
 ========================
 
  o WHOIS search by public key in attrs.
index 4cc836c88756d887e835f2569070efb8137f8b9f..d6894575f169179aa7b66666a85d43ef437b7fca 100644 (file)
@@ -261,16 +261,79 @@ void silc_client_del_connection(SilcClient client, SilcClientConnection conn)
 
   for (i = 0; i < client->internal->conns_count; i++)
     if (client->internal->conns[i] == conn) {
+      /* Free all cache entries */
+      SilcIDCacheList list;
+      SilcIDCacheEntry entry;
+      SilcClientCommandPending *r;
+      bool ret;
+
+      if (silc_idcache_get_all(conn->internal->client_cache, &list)) {
+       ret = silc_idcache_list_first(list, &entry);
+       while (ret) {
+         silc_client_del_client(client, conn, entry->context);
+         ret = silc_idcache_list_next(list, &entry);
+       }
+       silc_idcache_list_free(list);
+      }
 
-      silc_idcache_free(conn->internal->client_cache);
-      silc_idcache_free(conn->internal->channel_cache);
-      silc_idcache_free(conn->internal->server_cache);
-      if (conn->internal->pending_commands)
-       silc_dlist_uninit(conn->internal->pending_commands);
+      if (silc_idcache_get_all(conn->internal->channel_cache, &list)) {
+       ret = silc_idcache_list_first(list, &entry);
+       while (ret) {
+         silc_client_del_channel(client, conn, entry->context);
+         ret = silc_idcache_list_next(list, &entry);
+       }
+       silc_idcache_list_free(list);
+      }
+
+      if (silc_idcache_get_all(conn->internal->server_cache, &list)) {
+       ret = silc_idcache_list_first(list, &entry);
+       while (ret) {
+         silc_client_del_server(client, conn, entry->context);
+         ret = silc_idcache_list_next(list, &entry);
+       }
+       silc_idcache_list_free(list);
+      }
+
+      /* Clear ID caches */
+      if (conn->internal->client_cache)
+       silc_idcache_free(conn->internal->client_cache);
+      if (conn->internal->channel_cache)
+       silc_idcache_free(conn->internal->channel_cache);
+      if (conn->internal->server_cache)
+       silc_idcache_free(conn->internal->server_cache);
+
+      /* Free data (my ID is freed in above silc_client_del_client).
+        conn->nickname is freed when freeing the local_entry->nickname. */
       silc_free(conn->remote_host);
-      if (conn->internal->ftp_sessions)
-        silc_dlist_uninit(conn->internal->ftp_sessions);
+      silc_free(conn->local_id_data);
+      if (conn->internal->send_key)
+       silc_cipher_free(conn->internal->send_key);
+      if (conn->internal->receive_key)
+       silc_cipher_free(conn->internal->receive_key);
+      if (conn->internal->hmac_send)
+       silc_hmac_free(conn->internal->hmac_send);
+      if (conn->internal->hmac_receive)
+       silc_hmac_free(conn->internal->hmac_receive);
+      silc_free(conn->internal->rekey);
+
+      if (conn->internal->active_session) {
+       conn->sock->user_data = NULL;
+       silc_client_ftp_session_free(conn->internal->active_session);
+       conn->internal->active_session = NULL;
+      }
+
+      silc_client_ftp_free_sessions(client, conn);
+
+      if (conn->internal->pending_commands) {
+       silc_dlist_start(conn->internal->pending_commands);
+       while ((r = silc_dlist_get(conn->internal->pending_commands))
+              != SILC_LIST_END)
+         silc_dlist_del(conn->internal->pending_commands, r);
+       silc_dlist_uninit(conn->internal->pending_commands);
+      }
+
       silc_free(conn->internal);
+      memset(conn, 0, sizeof(*conn));
       silc_free(conn);
 
       client->internal->conns[i] = NULL;
@@ -1454,83 +1517,8 @@ void silc_client_close_connection_real(SilcClient client,
   }
 
   /* Free everything */
-  if (del && sock->user_data) {
-    /* Free all cache entries */
-    SilcIDCacheList list;
-    SilcIDCacheEntry entry;
-    SilcClientCommandPending *r;
-    bool ret;
-
-    if (silc_idcache_get_all(conn->internal->client_cache, &list)) {
-      ret = silc_idcache_list_first(list, &entry);
-      while (ret) {
-       silc_client_del_client(client, conn, entry->context);
-       ret = silc_idcache_list_next(list, &entry);
-      }
-      silc_idcache_list_free(list);
-    }
-
-    if (silc_idcache_get_all(conn->internal->channel_cache, &list)) {
-      ret = silc_idcache_list_first(list, &entry);
-      while (ret) {
-       silc_client_del_channel(client, conn, entry->context);
-       ret = silc_idcache_list_next(list, &entry);
-      }
-      silc_idcache_list_free(list);
-    }
-
-    if (silc_idcache_get_all(conn->internal->server_cache, &list)) {
-      ret = silc_idcache_list_first(list, &entry);
-      while (ret) {
-       silc_client_del_server(client, conn, entry->context);
-       ret = silc_idcache_list_next(list, &entry);
-      }
-      silc_idcache_list_free(list);
-    }
-
-    /* Clear ID caches */
-    if (conn->internal->client_cache)
-      silc_idcache_free(conn->internal->client_cache);
-    if (conn->internal->channel_cache)
-      silc_idcache_free(conn->internal->channel_cache);
-    if (conn->internal->server_cache)
-      silc_idcache_free(conn->internal->server_cache);
-
-    /* Free data (my ID is freed in above silc_client_del_client).
-       conn->nickname is freed when freeing the local_entry->nickname. */
-    if (conn->remote_host)
-      silc_free(conn->remote_host);
-    if (conn->local_id_data)
-      silc_free(conn->local_id_data);
-    if (conn->internal->send_key)
-      silc_cipher_free(conn->internal->send_key);
-    if (conn->internal->receive_key)
-      silc_cipher_free(conn->internal->receive_key);
-    if (conn->internal->hmac_send)
-      silc_hmac_free(conn->internal->hmac_send);
-    if (conn->internal->hmac_receive)
-      silc_hmac_free(conn->internal->hmac_receive);
-    if (conn->internal->rekey)
-      silc_free(conn->internal->rekey);
-
-    if (conn->internal->active_session) {
-      sock->user_data = NULL;
-      silc_client_ftp_session_free(conn->internal->active_session);
-      conn->internal->active_session = NULL;
-    }
-
-    silc_client_ftp_free_sessions(client, conn);
-
-    silc_dlist_start(conn->internal->pending_commands);
-    while ((r = silc_dlist_get(conn->internal->pending_commands))
-          != SILC_LIST_END)
-      silc_dlist_del(conn->internal->pending_commands, r);
-    if (conn->internal->pending_commands)
-      silc_dlist_uninit(conn->internal->pending_commands);
-
-    memset(conn, 0, sizeof(*conn));
+  if (del && sock->user_data)
     silc_client_del_connection(client, conn);
-  }
 
   silc_socket_free(sock);
 }