From 92a5750a53193a067f69883d2d5fe7cf8378b17a Mon Sep 17 00:00:00 2001 From: Patrik Weiskircher Date: Tue, 6 Mar 2007 21:52:38 +0000 Subject: [PATCH] Applied patch from Frank Benkstein. If invalid hmac or cipher was specified on joining a channel, server crashed. --- CHANGES | 6 +++++ apps/silcd/command.c | 60 +++++++++++++++++++++++++++++++++++--------- 2 files changed, 54 insertions(+), 12 deletions(-) diff --git a/CHANGES b/CHANGES index 78079c1d..3f82d806 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,9 @@ +Tue Mar 6 22:48:25 CET 2007 Patrik Weiskircher + + * Applied patch from Frank Benkstein. If invalid hmac or cipher + was specified on joining a channel, server crashed. Affected + file apps/silcd/command.c. + Tue Mar 6 22:19:44 CET 2007 Patrik Weiskircher * Removed references to lib/silcutil/epoc, fixed a bug in diff --git a/apps/silcd/command.c b/apps/silcd/command.c index fce57cfd..ed0964fc 100644 --- a/apps/silcd/command.c +++ b/apps/silcd/command.c @@ -2443,10 +2443,22 @@ SILC_SERVER_CMD_FUNC(join) channel = silc_server_create_new_channel(server, server->id, cipher, hmac, channel_name, TRUE); if (!channel) { - silc_server_command_send_status_data( - cmd, SILC_COMMAND_JOIN, - SILC_STATUS_ERR_UNKNOWN_ALGORITHM, - 0, 2, cipher, strlen(cipher)); + if (cipher) { + silc_server_command_send_status_data( + cmd, SILC_COMMAND_JOIN, + SILC_STATUS_ERR_UNKNOWN_ALGORITHM, + 0, 2, cipher, strlen(cipher)); + } else if (hmac) { + silc_server_command_send_status_data( + cmd, SILC_COMMAND_JOIN, + SILC_STATUS_ERR_UNKNOWN_ALGORITHM, + 0, 2, hmac, strlen(hmac)); + } else { + silc_server_command_send_status_reply( + cmd, SILC_COMMAND_JOIN, + SILC_STATUS_ERR_RESOURCE_LIMIT, + 0); + } silc_free(client_id); goto out; } @@ -2507,10 +2519,22 @@ SILC_SERVER_CMD_FUNC(join) channel = silc_server_create_new_channel(server, server->id, cipher, hmac, channel_name, TRUE); if (!channel) { - silc_server_command_send_status_data( - cmd, SILC_COMMAND_JOIN, - SILC_STATUS_ERR_UNKNOWN_ALGORITHM, 0, - 2, cipher, strlen(cipher)); + if (cipher) { + silc_server_command_send_status_data( + cmd, SILC_COMMAND_JOIN, + SILC_STATUS_ERR_UNKNOWN_ALGORITHM, + 0, 2, cipher, strlen(cipher)); + } else if (hmac) { + silc_server_command_send_status_data( + cmd, SILC_COMMAND_JOIN, + SILC_STATUS_ERR_UNKNOWN_ALGORITHM, + 0, 2, hmac, strlen(hmac)); + } else { + silc_server_command_send_status_reply( + cmd, SILC_COMMAND_JOIN, + SILC_STATUS_ERR_RESOURCE_LIMIT, + 0); + } silc_free(client_id); goto out; } @@ -2543,10 +2567,22 @@ SILC_SERVER_CMD_FUNC(join) channel = silc_server_create_new_channel(server, server->id, cipher, hmac, channel_name, TRUE); if (!channel) { - silc_server_command_send_status_data( - cmd, SILC_COMMAND_JOIN, - SILC_STATUS_ERR_UNKNOWN_ALGORITHM, 0, - 2, cipher, strlen(cipher)); + if (cipher) { + silc_server_command_send_status_data( + cmd, SILC_COMMAND_JOIN, + SILC_STATUS_ERR_UNKNOWN_ALGORITHM, + 0, 2, cipher, strlen(cipher)); + } else if (hmac) { + silc_server_command_send_status_data( + cmd, SILC_COMMAND_JOIN, + SILC_STATUS_ERR_UNKNOWN_ALGORITHM, + 0, 2, hmac, strlen(hmac)); + } else { + silc_server_command_send_status_reply( + cmd, SILC_COMMAND_JOIN, + SILC_STATUS_ERR_RESOURCE_LIMIT, + 0); + } silc_free(client_id); goto out; } -- 2.24.0