updates.
[silc.git] / lib / silcclient / client.c
index 7b0f1ca70531de22b38d2b7add43fda0508c9b6e..59945b6ece412ab3f45141dfd179852ed4724552 100644 (file)
@@ -1340,6 +1340,9 @@ void silc_client_close_connection_real(SilcClient client,
 
   SILC_LOG_DEBUG(("Start"));
 
+  if (!sock && !conn)
+    return;
+
   if (!sock || (sock && conn->sock == sock))
     del = TRUE;
   if (!sock)
@@ -1350,7 +1353,6 @@ void silc_client_close_connection_real(SilcClient client,
 
   /* Unregister all tasks */
   silc_schedule_task_del_by_fd(client->schedule, sock->sock);
-  silc_schedule_task_del_by_fd(client->schedule, sock->sock);
 
   /* Close the actual connection */
   silc_net_close_connection(sock->sock);
@@ -1378,6 +1380,7 @@ void silc_client_close_connection_real(SilcClient client,
     /* Free all cache entries */
     SilcIDCacheList list;
     SilcIDCacheEntry entry;
+    SilcClientCommandPending *r;
     bool ret;
 
     if (silc_idcache_get_all(conn->client_cache, &list)) {
@@ -1429,8 +1432,6 @@ void silc_client_close_connection_real(SilcClient client,
       silc_hmac_free(conn->hmac_send);
     if (conn->hmac_receive)
       silc_hmac_free(conn->hmac_receive);
-    if (conn->pending_commands)
-      silc_dlist_uninit(conn->pending_commands);
     if (conn->rekey)
       silc_free(conn->rekey);
 
@@ -1442,6 +1443,12 @@ void silc_client_close_connection_real(SilcClient client,
 
     silc_client_ftp_free_sessions(client, conn);
 
+    silc_dlist_start(conn->pending_commands);
+    while ((r = silc_dlist_get(conn->pending_commands)) != SILC_LIST_END)
+      silc_dlist_del(conn->pending_commands, r);
+    if (conn->pending_commands)
+      silc_dlist_uninit(conn->pending_commands);
+
     memset(conn, 0, sizeof(*conn));
     silc_client_del_connection(client, conn);
   }
@@ -1493,7 +1500,7 @@ void silc_client_disconnected_by_server(SilcClient client,
 
   if (packet->len > 1 &&
       silc_utf8_valid(packet->data + 1, packet->len - 1))
-    message = silc_memdup(packet->data, packet->len);
+    message = silc_memdup(packet->data + 1, packet->len - 1);
 
   client->internal->ops->say(client, sock->user_data, 
                             SILC_CLIENT_MESSAGE_AUDIT,