From 5b1ddffd99bfbb183454aa5b74aaff8d48546d04 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Sun, 24 Nov 2002 19:10:41 +0000 Subject: [PATCH] Fixed detaching bugs, channel key distribution after detach, resume client notify distribution, and bug #76. --- CHANGES | 17 +++++++++++++++ apps/silcd/packet_receive.c | 43 +++++++++++++++++++++---------------- apps/silcd/server.c | 3 ++- apps/silcd/serverconfig.c | 2 ++ doc/silcalgs.conf | 32 +++++++-------------------- 5 files changed, 53 insertions(+), 44 deletions(-) diff --git a/CHANGES b/CHANGES index 8985607d..2de9bb90 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,23 @@ Sun Nov 24 18:26:42 EET 2002 Pekka Riikonen 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 * Added support to backup router protocol for backup to tell diff --git a/apps/silcd/packet_receive.c b/apps/silcd/packet_receive.c index c65a6e5b..88681d97 100644 --- a/apps/silcd/packet_receive.c +++ b/apps/silcd/packet_receive.c @@ -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); } diff --git a/apps/silcd/server.c b/apps/silcd/server.c index c4af351c..250ae76c 100644 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@ -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); diff --git a/apps/silcd/serverconfig.c b/apps/silcd/serverconfig.c index 7eba42e6..73a38bfd 100644 --- a/apps/silcd/serverconfig.c +++ b/apps/silcd/serverconfig.c @@ -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); } diff --git a/doc/silcalgs.conf b/doc/silcalgs.conf index 0d84b6b4..f0140e5c 100644 --- a/doc/silcalgs.conf +++ b/doc/silcalgs.conf @@ -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 -- 2.24.0