Memory leak fixes.
[silc.git] / lib / silcclient / client.c
index 0ee9f52a78423ed50af27787ea2e6fea0c409fe4..c939fa7b1d924a11f866832075a8ce099d9c3c9a 100644 (file)
@@ -730,6 +730,11 @@ void silc_client_del_connection(SilcClient client, SilcClientConnection conn)
   if (conn->internal->sha1hash)
     silc_hash_free(conn->internal->sha1hash);
   silc_atomic_uninit16(&conn->internal->cmd_ident);
+  silc_free(conn->internal->away_message);
+  if (conn->internal->rekey)
+    silc_ske_free_rekey_material(conn->internal->rekey);
+  if (conn->internal->cop)
+    silc_async_free(conn->internal->cop);
 
   silc_free(conn->internal);
   memset(conn, 'F', sizeof(*conn));
@@ -862,13 +867,6 @@ void silc_client_close_connection(SilcClient client,
 {
   SILC_LOG_DEBUG(("Closing connection %p", conn));
 
-  /* If connection machine is not running, we just delete the connection */
-  if (!silc_fsm_is_started(&conn->internal->fsm)) {
-    silc_packet_stream_destroy(conn->stream);
-    silc_client_del_connection(conn->client, conn);
-    return;
-  }
-
   /* Signal to close connection */
   conn->internal->status = SILC_CLIENT_CONN_DISCONNECTED;
   if (!conn->internal->disconnected) {
@@ -934,7 +932,10 @@ void silc_client_free(SilcClient client)
     silc_hmac_unregister_all();
   }
 
+  silc_packet_engine_stop(client->internal->packet_engine);
+  silc_dlist_uninit(client->internal->ftp_sessions);
   silc_atomic_uninit16(&client->internal->conns);
+  silc_mutex_free(client->internal->lock);
   silc_free(client->username);
   silc_free(client->hostname);
   silc_free(client->realname);