Handle command reply lists in threads.
[silc.git] / lib / silcclient / command_reply.c
index ea1f74b0f2cd98e8da17d5759e04a0b2e046f366..236fb0f67674b23a236bea53b5b9a30fd8912d8f 100644 (file)
@@ -69,6 +69,7 @@ static inline void
 silc_client_command_callback(SilcClientCommandContext cmd, ...)
 {
   SilcClientCommandReplyCallback cb;
+  SilcList list;
   va_list ap, cp;
 
   va_start(ap, cmd);
@@ -83,8 +84,9 @@ silc_client_command_callback(SilcClientCommandContext cmd, ...)
   }
 
   /* Reply callback */
-  silc_list_start(cmd->reply_callbacks);
-  while ((cb = silc_list_get(cmd->reply_callbacks)))
+  list = cmd->reply_callbacks;
+  silc_list_start(list);
+  while ((cb = silc_list_get(list)))
     if (!cb->do_not_call) {
       silc_va_copy(cp, ap);
       cb->do_not_call = !cb->reply(cmd->conn->client, cmd->conn, cmd->cmd,
@@ -195,6 +197,12 @@ SILC_FSM_STATE(silc_client_command_reply_timeout)
   SilcClientConnection conn = cmd->conn;
   SilcArgumentPayload args = NULL;
 
+  if (conn->internal->disconnected) {
+    SILC_LOG_DEBUG(("Command %s canceled", silc_get_command_name(cmd->cmd)));
+    silc_list_del(conn->internal->pending_commands, cmd);
+    return SILC_FSM_FINISH;
+  }
+
   SILC_LOG_DEBUG(("Command %s timeout", silc_get_command_name(cmd->cmd)));
 
   /* Timeout, reply not received in timely fashion */