6a5d731296
- silcd: check entity validity after command reply - Packet engine: prevent divide by 0 - SKE: Make sure failure received from remote is error status.
74 lines
2.3 KiB
Plaintext
74 lines
2.3 KiB
Plaintext
$OpenBSD: patch-apps_silcd_command_c,v 1.5 2010/05/17 08:39:24 sthen Exp $
|
|
--- apps/silcd/command.c.orig Sat Sep 26 16:34:12 2009
|
|
+++ apps/silcd/command.c Sun May 16 21:05:33 2010
|
|
@@ -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")); \
|
|
@@ -120,27 +148,6 @@ do { \
|
|
return; \
|
|
} \
|
|
} 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 {
|