seconds. */
if (sock->type == SILC_SOCKET_TYPE_CLIENT) {
SilcClientEntry client = (SilcClientEntry)sock->user_data;
- SilcServerCommandTimeout timeout = silc_calloc(1, sizeof(*timeout));
+ SilcServerCommandTimeout timeout;
int fast;
+ if (!client) {
+ SILC_LOG_DEBUG(("Client entry is invalid"));
+ silc_server_command_free(ctx);
+ }
+
+ timeout = silc_calloc(1, sizeof(*timeout));
timeout->ctx = ctx;
timeout->cmd = cmd;
silc_dlist_start(server->pending_commands);
while ((r = silc_dlist_get(server->pending_commands)) != SILC_LIST_END) {
- if (r->reply_cmd == reply_cmd && r->ident == ident) {
+ if ((r->reply_cmd == reply_cmd || (r->reply_cmd == SILC_COMMAND_NONE &&
+ r->reply_check))
+ && r->ident == ident) {
silc_dlist_del(server->pending_commands, r);
- break;
+ silc_free(r);
}
}
}
callbacks = silc_realloc(callbacks, sizeof(*callbacks) * (i + 1));
callbacks[i].context = r->context;
callbacks[i].callback = r->callback;
+ r->reply_check = TRUE;
ctx->ident = ident;
i++;
}
SilcUInt16 ident = silc_command_get_ident(cmd->payload);
char nh[256], uh[256];
unsigned char idle[4], mode[4];
- unsigned char *fingerprint;
+ unsigned char *fingerprint, fempty[20];
SilcSocketConnection hsock;
if (nickname) {
}
}
+ memset(fempty, 0, sizeof(fempty));
+
/* Start processing found clients. */
status = SILC_STATUS_OK;
if (valid_count > 1)
channels = silc_server_get_client_channel_list(server, entry, TRUE,
TRUE, &umode_list);
- if (entry->data.fingerprint[0] != 0 && entry->data.fingerprint[1] != 0)
+ if (memcmp(entry->data.fingerprint, fempty, sizeof(fempty)))
fingerprint = entry->data.fingerprint;
else
fingerprint = NULL;
break;
}
+ silc_id_payload_free(idp);
silc_free(id);
}
}
SilcUInt16 ident = silc_command_get_ident(cmd->payload);
int nickfail = 0;
- if (cmd->sock->type != SILC_SOCKET_TYPE_CLIENT)
+ if (cmd->sock->type != SILC_SOCKET_TYPE_CLIENT || !client)
goto out;
SILC_SERVER_COMMAND_CHECK(SILC_COMMAND_NICK, cmd, 1, 1);
SilcUInt32 argc, tmp_len;
SilcUInt16 ident = silc_command_get_ident(cmd->payload);
+ if (cmd->sock->type != SILC_SOCKET_TYPE_CLIENT || !client)
+ goto out;
+
SILC_SERVER_COMMAND_CHECK(SILC_COMMAND_TOPIC, cmd, 1, 2);
argc = silc_argument_get_arg_num(cmd->args);
/* Check whether the sender of this command is on the channel. */
sender = (SilcClientEntry)sock->user_data;
- if (!silc_server_client_on_channel(sender, channel, &chl)) {
+ if (!sender || !silc_server_client_on_channel(sender, channel, &chl)) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_INVITE,
SILC_STATUS_ERR_NOT_ON_CHANNEL, 0);
goto out;
SILC_SERVER_COMMAND_CHECK(SILC_COMMAND_KILL, cmd, 1, 2);
- if (!client || cmd->sock->type != SILC_SOCKET_TYPE_CLIENT)
+ if (cmd->sock->type != SILC_SOCKET_TYPE_CLIENT || !client)
goto out;
/* KILL command works only on router */
/* Get the client entry */
if (cmd->sock->type == SILC_SOCKET_TYPE_CLIENT) {
client = (SilcClientEntry)sock->user_data;
+ if (!client)
+ return;
} else {
client = silc_server_get_client_resolve(server, client_id, FALSE,
&resolve);
if (cmd->sock->type == SILC_SOCKET_TYPE_CLIENT) {
SilcClientEntry entry = (SilcClientEntry)cmd->sock->user_data;
+ if (!entry) {
+ silc_server_command_send_status_reply(cmd, SILC_COMMAND_JOIN,
+ SILC_STATUS_ERR_NOT_ENOUGH_PARAMS,
+ 0);
+ goto out;
+ }
+
silc_free(client_id);
client_id = silc_id_dup(entry->id, SILC_ID_CLIENT);
SilcUInt16 ident = silc_command_get_ident(cmd->payload);
bool set_mask = FALSE;
- if (cmd->sock->type != SILC_SOCKET_TYPE_CLIENT)
+ if (cmd->sock->type != SILC_SOCKET_TYPE_CLIENT || !client)
goto out;
SILC_SERVER_COMMAND_CHECK(SILC_COMMAND_UMODE, cmd, 1, 2);
unsigned char *fkey = NULL;
SilcUInt32 fkey_len = 0;
+ if (!client) {
+ silc_server_command_free(cmd);
+ return;
+ }
+
SILC_SERVER_COMMAND_CHECK(SILC_COMMAND_CMODE, cmd, 1, 7);
/* Get Channel ID */
silc_server_command_send_status_reply(cmd, SILC_COMMAND_CMODE,
SILC_STATUS_ERR_AUTH_FAILED,
0);
+ silc_pkcs_public_key_free(channel->founder_key);
+ channel->founder_key = NULL;
goto out;
}
}
unsigned char *fkey = NULL;
SilcUInt32 fkey_len = 0;
+ if (!client)
+ goto out;
+
SILC_SERVER_COMMAND_CHECK(SILC_COMMAND_CUMODE, cmd, 3, 4);
/* Get Channel ID */
SilcUInt32 tmp_len, target_idp_len;
unsigned char *tmp, *comment, *target_idp;
+ if (!client)
+ goto out;
+
SILC_SERVER_COMMAND_CHECK(SILC_COMMAND_LEAVE, cmd, 1, 3);
/* Get Channel ID */
bool result = FALSE;
SilcPublicKey cached_key;
- SILC_SERVER_COMMAND_CHECK(SILC_COMMAND_OPER, cmd, 1, 2);
-
- if (!client || cmd->sock->type != SILC_SOCKET_TYPE_CLIENT)
+ if (cmd->sock->type != SILC_SOCKET_TYPE_CLIENT || !client)
goto out;
+ SILC_SERVER_COMMAND_CHECK(SILC_COMMAND_OPER, cmd, 1, 2);
+
/* Get the username */
username = silc_argument_get_arg_type(cmd->args, 1, &tmp_len);
if (!username) {
client->mode |= SILC_UMODE_SERVER_OPERATOR;
/* Update statistics */
- if (client->connection)
+ if (SILC_IS_LOCAL(client))
server->stat.my_server_ops++;
if (server->server_type == SILC_ROUTER)
server->stat.server_ops++;
goto out;
}
- if (cmd->sock->type != SILC_SOCKET_TYPE_CLIENT)
+ if (cmd->sock->type != SILC_SOCKET_TYPE_CLIENT || !client)
goto out;
SILC_SERVER_COMMAND_CHECK(SILC_COMMAND_DETACH, cmd, 0, 0);
/* Remove operator privileges, since the client may resume in some
other server which to it does not have operator privileges. */
- client->mode &= ~(SILC_UMODE_SERVER_OPERATOR |
- SILC_UMODE_ROUTER_OPERATOR);
+ SILC_OPER_STATS_UPDATE(client, server, SILC_UMODE_SERVER_OPERATOR);
+ SILC_OPER_STATS_UPDATE(client, router, SILC_UMODE_ROUTER_OPERATOR);
/* Send the user mode notify to notify that client is detached */
client->mode |= SILC_UMODE_DETACHED;
bool result = FALSE;
SilcPublicKey cached_key;
- SILC_SERVER_COMMAND_CHECK(SILC_COMMAND_SILCOPER, cmd, 1, 2);
-
- if (!client || cmd->sock->type != SILC_SOCKET_TYPE_CLIENT)
+ if (cmd->sock->type != SILC_SOCKET_TYPE_CLIENT || !client)
goto out;
+ SILC_SERVER_COMMAND_CHECK(SILC_COMMAND_SILCOPER, cmd, 1, 2);
+
if (server->server_type != SILC_ROUTER) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_SILCOPER,
SILC_STATUS_ERR_AUTH_FAILED, 0);
client->mode |= SILC_UMODE_ROUTER_OPERATOR;
/* Update statistics */
- if (client->connection)
+ if (SILC_IS_LOCAL(client))
server->stat.my_router_ops++;
if (server->server_type == SILC_ROUTER)
server->stat.router_ops++;
SilcUInt32 id_len, tmp_len;
SilcUInt16 ident = silc_command_get_ident(cmd->payload);
- if (cmd->sock->type != SILC_SOCKET_TYPE_CLIENT)
+ if (cmd->sock->type != SILC_SOCKET_TYPE_CLIENT || !client)
goto out;
SILC_SERVER_COMMAND_CHECK(SILC_COMMAND_BAN, cmd, 0, 3);
SilcUInt32 len;
unsigned char *tmp;
+ if (cmd->sock->type != SILC_SOCKET_TYPE_CLIENT || !id_entry)
+ goto out;
+
SILC_SERVER_COMMAND_CHECK(SILC_COMMAND_LEAVE, cmd, 1, 2);
/* Get Channel ID */
SilcUInt32 tmp_len;
SilcUInt32 port = SILC_PORT;
- SILC_SERVER_COMMAND_CHECK(SILC_COMMAND_PRIV_CONNECT, cmd, 1, 2);
-
- if (!client || cmd->sock->type != SILC_SOCKET_TYPE_CLIENT)
+ if (cmd->sock->type != SILC_SOCKET_TYPE_CLIENT || !client)
goto out;
+ SILC_SERVER_COMMAND_CHECK(SILC_COMMAND_PRIV_CONNECT, cmd, 1, 2);
+
/* Check whether client has the permissions. */
if (!(client->mode & SILC_UMODE_SERVER_OPERATOR) &&
!(client->mode & SILC_UMODE_ROUTER_OPERATOR)) {
unsigned char *name;
SilcUInt32 port = SILC_PORT;
- SILC_SERVER_COMMAND_CHECK(SILC_COMMAND_PRIV_CLOSE, cmd, 1, 2);
-
- if (!client || cmd->sock->type != SILC_SOCKET_TYPE_CLIENT)
+ if (cmd->sock->type != SILC_SOCKET_TYPE_CLIENT || !client)
goto out;
+ SILC_SERVER_COMMAND_CHECK(SILC_COMMAND_PRIV_CLOSE, cmd, 1, 2);
+
/* Check whether client has the permissions. */
if (!(client->mode & SILC_UMODE_SERVER_OPERATOR) &&
!(client->mode & SILC_UMODE_ROUTER_OPERATOR)) {
SilcServer server = cmd->server;
SilcClientEntry client = (SilcClientEntry)cmd->sock->user_data;
- SILC_SERVER_COMMAND_CHECK(SILC_COMMAND_PRIV_SHUTDOWN, cmd, 0, 0);
-
- if (!client || cmd->sock->type != SILC_SOCKET_TYPE_CLIENT)
+ if (cmd->sock->type != SILC_SOCKET_TYPE_CLIENT || !client)
goto out;
+ SILC_SERVER_COMMAND_CHECK(SILC_COMMAND_PRIV_SHUTDOWN, cmd, 0, 0);
+
/* Check whether client has the permission. */
if (!(client->mode & SILC_UMODE_SERVER_OPERATOR) &&
!(client->mode & SILC_UMODE_ROUTER_OPERATOR)) {