openbsd-ports/net/silc-server/patches/patch-apps_silcd_command_c
sthen 6a5d731296 Roll in some fixes from upstream.. From Brad.
- silcd: check entity validity after command reply
- Packet engine: prevent divide by 0
- SKE: Make sure failure received from remote is error status.
2010-05-17 08:39:24 +00:00

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 {