Fixed detaching bugs, channel key distribution after detach,
authorPekka Riikonen <priikone@silcnet.org>
Sun, 24 Nov 2002 19:10:41 +0000 (19:10 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Sun, 24 Nov 2002 19:10:41 +0000 (19:10 +0000)
resume client notify distribution, and bug #76.

CHANGES
apps/silcd/packet_receive.c
apps/silcd/server.c
apps/silcd/serverconfig.c
doc/silcalgs.conf

diff --git a/CHANGES b/CHANGES
index 8985607de9118f987561a2a30d83daf6a71c2a25..2de9bb90c0c0e0f3d10f08bafe5be55f7ff7fcfe 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,23 @@ Sun Nov 24 18:26:42 EET 2002  Pekka Riikonen <priikone@silcnet.org>
          automatically the cipher's internal IV.  Affected files
          lib/silccrypt/silccipher.[ch].
 
+       * Assure the RESUME_CLIENT packet is not sent to twice to
+         backup router if the detached client was originated from
+         the backup.  Affected file silcd/server.c.  Bug #76.
+
+       * Changed silc_sim_symname to not allocate memory.  Affected
+         file lib/silcsim/silcsimutil.c.
+
+       * Fixed memory leaks with SIMs in server.  Affected files
+         silcd/serverconfig.c, silcd/server.c.
+
+       * Fixed channel key distribution after resuming detached
+         client.  Affected files silcd/packet_receive.c.
+
+       * Fixed channel's global_user boolean checking after detaching.
+         Check it after changing the owner of the client not before.
+         Affected file silcd/packet_receive.c.
+
 Fri Nov 22 18:34:20 EET 2002  Pekka Riikonen <priikone@silcnet.org>
 
        * Added support to backup router protocol for backup to tell
index c65a6e5b490ac65e8389e743f3555a81829e1996..88681d97f4a33bac7e3b172dab8df2996a760e58 100644 (file)
@@ -3646,7 +3646,8 @@ void silc_server_resume_client(SilcServer server,
     silc_server_packet_send(server, SILC_PRIMARY_ROUTE(server),
                            SILC_PACKET_RESUME_CLIENT, 0, 
                            buf->data, buf->len, TRUE);
-    silc_server_backup_send(server, NULL, SILC_PACKET_RESUME_CLIENT, 0,
+    silc_server_backup_send(server, detached_client->router,
+                           SILC_PACKET_RESUME_CLIENT, 0,
                            buf->data, buf->len, TRUE, TRUE);
 
     /* As router we must deliver this packet directly to the original
@@ -3777,14 +3778,18 @@ void silc_server_resume_client(SilcServer server,
                                        channel->key_len / 8, channel->key);
       silc_free(id_string);
 
-      /* Send the key packet to client */
+      /* Send the channel key to the client */
       silc_server_packet_send(server, sock, SILC_PACKET_CHANNEL_KEY, 0, 
                              keyp->data, keyp->len, FALSE);
 
-      if (created && server->server_type == SILC_SERVER)
-       silc_server_packet_send(server, SILC_PRIMARY_ROUTE(server), 
-                               SILC_PACKET_CHANNEL_KEY, 0, 
-                               keyp->data, keyp->len, FALSE);
+      /* Distribute the channel key to channel */
+      if (created) {
+       silc_server_send_channel_key(server, NULL, channel,
+                                    server->server_type == SILC_ROUTER ? 
+                                    FALSE : !server->standalone);
+       silc_server_backup_send(server, NULL, SILC_PACKET_CHANNEL_KEY, 0,
+                               keyp->data, keyp->len, FALSE, TRUE);
+      }
 
       silc_buffer_free(keyp);
     }
@@ -3863,15 +3868,6 @@ void silc_server_resume_client(SilcServer server,
     detached_client->data.status &= ~SILC_IDLIST_STATUS_LOCAL;
     id_cache->expire = 0;
 
-    /* Update channel information regarding global clients on channel. */
-    if (server->server_type == SILC_SERVER) {
-      silc_hash_table_list(detached_client->channels, &htl);
-      while (silc_hash_table_get(&htl, NULL, (void **)&chl))
-       chl->channel->global_users = 
-         silc_server_channel_has_global(chl->channel);
-      silc_hash_table_list_reset(&htl);
-    }
-
     silc_schedule_task_del_by_context(server->schedule, detached_client);
 
     /* Get the new owner of the resumed client */
@@ -3898,7 +3894,7 @@ void silc_server_resume_client(SilcServer server,
     }
 
     if (server->server_type == SILC_ROUTER &&
-       sock->type == SILC_SOCKET_TYPE_ROUTER && 
+       sock->type == SILC_SOCKET_TYPE_ROUTER &&
        server_entry->server_type == SILC_ROUTER)
       local = FALSE;
 
@@ -3907,15 +3903,24 @@ void silc_server_resume_client(SilcServer server,
                                     detached_client))
       silc_idcache_del_by_context(server->global_list->clients,
                                  detached_client);
-    silc_idcache_add(local && server->server_type == SILC_ROUTER ? 
-                    server->local_list->clients : 
-                    server->global_list->clients, 
+    silc_idcache_add(local && server->server_type == SILC_ROUTER ?
+                    server->local_list->clients :
+                    server->global_list->clients,
                     detached_client->nickname,
                     detached_client->id, detached_client, FALSE, NULL);
 
     /* Change the owner of the client */
     detached_client->router = server_entry;
 
+    /* Update channel information regarding global clients on channel. */
+    if (server->server_type != SILC_ROUTER) {
+      silc_hash_table_list(detached_client->channels, &htl);
+      while (silc_hash_table_get(&htl, NULL, (void **)&chl))
+       chl->channel->global_users = 
+         silc_server_channel_has_global(chl->channel);
+      silc_hash_table_list_reset(&htl);
+    }
+
     silc_free(server_id);
   }
 
index c4af351c9a1bc3aafc4e4296db83d4dd11b5dd7f..250ae76cefeaf1399c287a807cefb8bdd45e8826 100644 (file)
@@ -85,9 +85,10 @@ void silc_server_free(SilcServer server)
 #ifdef SILC_SIM
   {
     SilcSim sim;
-    
+    silc_dlist_start(server->sim);
     while ((sim = silc_dlist_get(server->sim)) != SILC_LIST_END) {
       silc_dlist_del(server->sim, sim);
+      silc_sim_close(sim);
       silc_sim_free(sim);
     }
     silc_dlist_uninit(server->sim);
index 7eba42e613e78942f928903eae2e3a0a6fd6ae1b..73a38bfde43bba4a89a656b8cd95d75622496d76 100644 (file)
@@ -1540,6 +1540,7 @@ bool silc_server_config_register_ciphers(SilcServer server)
        silc_free(alg_name);
       } else {
        SILC_LOG_ERROR(("Error configuring ciphers"));
+        silc_sim_free(sim);
        silc_server_stop(server);
        exit(1);
       }
@@ -1623,6 +1624,7 @@ bool silc_server_config_register_hashfuncs(SilcServer server)
        silc_dlist_add(server->sim, sim);
       } else {
        SILC_LOG_ERROR(("Error configuring hash functions"));
+        silc_sim_free(sim);
        silc_server_stop(server);
        exit(1);
       }
index 0d84b6b49dc94eb9cb785c284fd36b8adf6b9d3c..f0140e5c42382c68a6bfa48a62301df4ee325d74 100644 (file)
@@ -55,30 +55,14 @@ cipher {
        keylength = 16;
        blocklength = 16;
 };
-cipher {
-       name = "mars-256-cbc";
-       module = "mars.sim.so";
-       keylength = 32;
-       blocklength = 16;
-};
-cipher {
-       name = "mars-192-cbc";
-       module = "mars.sim.so";
-       keylength = 24;
-       blocklength = 16;
-};
-cipher {
-       name = "mars-128-cbc";
-       module = "mars.sim.so";
-       keylength = 16;
-       blocklength = 16;
-};
-cipher {
-       name = "none";
-       module = "none.sim.so";
-       keylength = 0;
-       blocklength = 0;
-};
+
+# "none" cipher should not be used
+#cipher {
+#      name = "none";
+#      module = "none.sim.so";
+#      keylength = 0;
+#      blocklength = 0;
+#};
 
 #
 # Configured hash functions