updates
authorPekka Riikonen <priikone@silcnet.org>
Fri, 17 May 2002 06:34:13 +0000 (06:34 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Fri, 17 May 2002 06:34:13 +0000 (06:34 +0000)
CHANGES
apps/silcd/command.c
apps/silcd/packet_receive.c
apps/silcd/server_util.c

diff --git a/CHANGES b/CHANGES
index 9c8d36d1b507eace0cfe6ff2049766536c04d227..6e12aef3668047ba984ac43a9b13bb71fa7788f3 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,8 @@
+Fri May 17 08:33:41 CEST 2002 Pekka Riikonen <priikone@silcnet.org>
+
+       * Fixed watcher list checking during server signoff.  It
+         crashed the server.  Affected file silcd/server_util.c.
+
 Thu May 16 13:05:13 CEST 2002 Pekka Riikonen <priikone@silcnet.org>
 
        * The nickname argument to watch notify can be optional.
index be654fdb0c743c99dd903ab1e76d0ac3bf64628f..28c4663405244fb4d450307feeb6bf9852e40070 100644 (file)
@@ -4206,8 +4206,21 @@ SILC_SERVER_CMD_FUNC(cmode)
 
        /* Save the public key */
        channel->founder_key = silc_pkcs_public_key_copy(idata->public_key);
+        if (!channel->founder_key) {
+         silc_server_command_send_status_reply(cmd, SILC_COMMAND_CMODE,
+                                               SILC_STATUS_ERR_AUTH_FAILED,
+                                               0);
+         goto out;
+        }
+
        founder_key = channel->founder_key;
        fkey = silc_pkcs_public_key_encode(founder_key, &fkey_len);
+        if (!fkey) {
+         silc_server_command_send_status_reply(cmd, SILC_COMMAND_CMODE,
+                                               SILC_STATUS_ERR_AUTH_FAILED,
+                                               0);
+         goto out;
+        }
       }
     }
   } else {
@@ -4423,6 +4436,11 @@ SILC_SERVER_CMD_FUNC(cumode)
       notify = TRUE;
       founder_key = channel->founder_key;
       fkey = silc_pkcs_public_key_encode(founder_key, &fkey_len);
+      if (!fkey) {
+       silc_server_command_send_status_reply(cmd, SILC_COMMAND_CUMODE,
+                                             SILC_STATUS_ERR_AUTH_FAILED, 0);
+       goto out;
+      }
     }
   } else {
     if (chl->mode & SILC_CHANNEL_UMODE_CHANFO) {
index 2f31f6dbddbc653b34c3d4c42a203639f7002f70..91d08cd3925a399d7dbf93679d6bd83557c345aa 100644 (file)
@@ -634,6 +634,17 @@ void silc_server_notify(SilcServer server,
       }
     }
 
+    if (mode & SILC_CHANNEL_MODE_FOUNDER_AUTH && !channel->founder_key &&
+       server->server_type == SILC_ROUTER) {
+      SILC_LOG_DEBUG(("Enforcing sender to change channel mode"));
+      mode &= ~SILC_CHANNEL_MODE_FOUNDER_AUTH;
+      silc_server_send_notify_cmode(server, sock, FALSE, channel,
+                                   mode, server->id, SILC_ID_SERVER,
+                                   channel->cipher, 
+                                   channel->hmac_name,
+                                   channel->passphrase, NULL);
+    }
+
     /* Change mode */
     channel->mode = mode;
 
index 4cb11f4b76d1c40b032d5dc69b40b5966443172a..d9d2319cf4b8451d23388d07b92ae41bc0420f59 100644 (file)
@@ -194,10 +194,9 @@ bool silc_server_remove_clients_by_server(SilcServer server,
          client->data.status &= ~SILC_IDLIST_STATUS_REGISTERED;
          id_cache->expire = SILC_ID_CACHE_EXPIRE_DEF;
        } else {
-         silc_idlist_del_client(server->local_list, client);
-
          /* Remove this client from watcher list if it is */
          silc_server_del_from_watcher_list(server, client);
+         silc_idlist_del_client(server->local_list, client);
        }
 
        if (!silc_idcache_list_next(list, &id_cache))
@@ -1266,7 +1265,6 @@ void silc_server_kill_client(SilcServer server,
     if (!silc_idlist_del_client(server->global_list, remote_client)) {
       /* Remove this client from watcher list if it is */
       silc_server_del_from_watcher_list(server, remote_client);
-
       silc_idlist_del_client(server->local_list, remote_client);  
     }
   }