Reprocess JOIN command synchronously after resolving channel
authorPekka Riikonen <priikone@silcnet.org>
Thu, 15 Nov 2007 16:07:38 +0000 (16:07 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Thu, 15 Nov 2007 16:07:38 +0000 (16:07 +0000)
        user list.  In JOIN command reply check if the channel key is already
        saved.  If it is we have received new key from server while
        resolving user and must not save the old key.

CHANGES.TOOLKIT
lib/silcclient/command_reply.c

index 2ef30cf3fd19b2d0c6ff9f1da3ef5f43a2503f9b..bd514cefe62ae394920dfa862d30e34f4311857b 100644 (file)
@@ -10,6 +10,14 @@ Thu Nov 15 16:45:48 EET 2007 Pekka Riikonen <priikone@silcnet.org>
          closely fully resolved, report it to application.  Affected
          file is lib/silcclient/command_reply.c.
 
+       * Reprocess JOIN command synchronously after resolving channel
+         user list.  Affected file is lib/silcclient/command_reply.c.
+
+       * In JOIN command reply check if the channel key is already
+         saved.  If it is we have received new key from server while
+         resolving user and must not save the old key.  Affected file
+         is lib/silcclient/command_reply.c.
+
 Tue Nov 13 18:24:56 EET 2007 Pekka Riikonen <priikone@silcnet.org>
 
        * Added missing channel unreferencing in CMODE, CUMODE,
index ee71a4264b0c6fa3d7f107fd98fc2a72661bfa02..cf2743af130c4a44ccbb5c8310213a831a0c4e4d 100644 (file)
@@ -1138,7 +1138,7 @@ silc_client_command_reply_join_resolved(SilcClient client,
   channel->internal.resolve_cmd_ident = 0;
   silc_client_unref_channel(client, conn, channel);
 
-  SILC_FSM_CALL_CONTINUE(&cmd->thread);
+  SILC_FSM_CALL_CONTINUE_SYNC(&cmd->thread);
 }
 
 
@@ -1287,8 +1287,13 @@ SILC_FSM_STATE(silc_client_command_reply_join)
   /* Get channel key and save it */
   tmp = silc_argument_get_arg_type(args, 7, &len);
   if (tmp) {
-    silc_buffer_set(&keyp, tmp, len);
-    silc_client_save_channel_key(client, conn, &keyp, channel);
+    /* If channel key already exists on the channel then while resolving
+       the user list we have already received new key from server.  Don't
+       replace it with this old key. */
+    if (!channel->internal.send_key) {
+      silc_buffer_set(&keyp, tmp, len);
+      silc_client_save_channel_key(client, conn, &keyp, channel);
+    }
   }
 
   /* Get topic */