From ce98ad0c8cccde0800533b0314f2eb92c8b4c9f8 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Tue, 11 May 2010 08:10:10 +0300 Subject: [PATCH] silcd: check entity validity after command reply When processing pending command after command reply check that the entity, client or server, is still registered before processing the command. --- apps/silcd/command.c | 49 +++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/apps/silcd/command.c b/apps/silcd/command.c index 2bb776e8..9439f488 100644 --- a/apps/silcd/command.c +++ b/apps/silcd/command.c @@ -85,6 +85,27 @@ SilcServerCommand silc_command_list[] = { NULL, 0 }, }; +/* Returns TRUE if the connection is registered. Unregistered connections + usually cannot send commands hence the check. */ + +static int silc_server_is_registered(SilcServer server, + SilcPacketStream sock, + SilcServerCommandContext cmd, + SilcCommand command) +{ + SilcIDListData idata = silc_packet_get_context(sock); + + if (!idata) + return FALSE; + + if (idata->status & SILC_IDLIST_STATUS_REGISTERED) + return TRUE; + + silc_server_command_send_status_reply(cmd, command, + SILC_STATUS_ERR_NOT_REGISTERED, 0); + return FALSE; +} + /* Performs several checks to the command. It first checks whether this command was called as pending command callback. If it was then it checks whether error occurred in the command reply where the pending command @@ -102,6 +123,13 @@ do { \ return; \ } \ \ + if (context2 && \ + !silc_server_is_registered(cmd->server, cmd->sock, cmd, command)) { \ + SILC_LOG_DEBUG(("Not registered, command not called")); \ + silc_server_command_free(cmd); \ + return; \ + } \ + \ _argc = silc_argument_get_arg_num(cmd->args); \ if (_argc < min) { \ SILC_LOG_DEBUG(("Not enough parameters in command")); \ @@ -121,27 +149,6 @@ do { \ } \ } while(0) -/* Returns TRUE if the connection is registered. Unregistered connections - usually cannot send commands hence the check. */ - -static int silc_server_is_registered(SilcServer server, - SilcPacketStream sock, - SilcServerCommandContext cmd, - SilcCommand command) -{ - SilcIDListData idata = silc_packet_get_context(sock); - - if (!idata) - return FALSE; - - if (idata->status & SILC_IDLIST_STATUS_REGISTERED) - return TRUE; - - silc_server_command_send_status_reply(cmd, command, - SILC_STATUS_ERR_NOT_REGISTERED, 0); - return FALSE; -} - /* Internal context to hold data when executed command with timeout. */ typedef struct { SilcServerCommandContext ctx; -- 2.24.0