From: Pekka Riikonen Date: Sat, 2 Nov 2002 10:55:21 +0000 (+0000) Subject: Fixed connection freeing to not crash in disconnection. X-Git-Tag: silc.server.0.9.8~10 X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=commitdiff_plain;h=5f9b1e9701fc699e68af0e5778c0bff294031d6f Fixed connection freeing to not crash in disconnection. --- diff --git a/CHANGES b/CHANGES index a482f5aa..19e6d29b 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,10 @@ +Sat Nov 2 12:53:09 EET 2002 Pekka Riikonen + + * 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 * Changed includes/silcincludes.h to silcincludes.h.in to diff --git a/TODO b/TODO index bb4c0761..2e5e4059 100644 --- 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. diff --git a/lib/silcclient/client.c b/lib/silcclient/client.c index 4cc836c8..d6894575 100644 --- a/lib/silcclient/client.c +++ b/lib/silcclient/client.c @@ -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); }