From: Pekka Riikonen Date: Wed, 24 Sep 2008 13:53:38 +0000 (+0300) Subject: Fixed more backup router reconnecting problems X-Git-Tag: silc.server.1.1.13~2 X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=commitdiff_plain;h=35f90f6e65d24d42ba1988ff91f2842fe9c386b5 Fixed more backup router reconnecting problems Fixed also possible buffer overflows. --- diff --git a/apps/silcd/command.c b/apps/silcd/command.c index 8040467f..f35969ec 100644 --- a/apps/silcd/command.c +++ b/apps/silcd/command.c @@ -1557,12 +1557,13 @@ SILC_SERVER_CMD_FUNC(info) char info_string[256]; memset(info_string, 0, sizeof(info_string)); - snprintf(info_string, sizeof(info_string), - "location: %s server: %s admin: %s <%s>", - server->config->server_info->location, - server->config->server_info->server_type, - server->config->server_info->admin, - server->config->server_info->email); + silc_snprintf(info_string, sizeof(info_string), + "location: %s server: %s admin: %s <%s> version: %s", + server->config->server_info->location, + server->config->server_info->server_type, + server->config->server_info->admin, + server->config->server_info->email, + silc_dist_version); server_info = info_string; entry = server->id_entry; @@ -2823,7 +2824,7 @@ SILC_SERVER_CMD_FUNC(umode) SilcServer server = cmd->server; SilcClientEntry client = silc_packet_get_context(cmd->sock); unsigned char *tmp_mask, m[4]; - SilcUInt32 mask = 0; + SilcUInt32 mask = 0, tmp_len; SilcUInt16 ident = silc_command_get_ident(cmd->payload); SilcBool set_mask = FALSE; @@ -2833,8 +2834,8 @@ SILC_SERVER_CMD_FUNC(umode) SILC_SERVER_COMMAND_CHECK(SILC_COMMAND_UMODE, cmd, 1, 2); /* Get the client's mode mask */ - tmp_mask = silc_argument_get_arg_type(cmd->args, 2, NULL); - if (tmp_mask) { + tmp_mask = silc_argument_get_arg_type(cmd->args, 2, &tmp_len); + if (tmp_mask && tmp_len == 4) { SILC_GET32_MSB(mask, tmp_mask); set_mask = TRUE; } @@ -2947,7 +2948,7 @@ SILC_SERVER_CMD_FUNC(cmode) /* Get the channel mode mask */ tmp_mask = silc_argument_get_arg_type(cmd->args, 2, &tmp_len); - if (tmp_mask) { + if (tmp_mask && tmp_len == 4) { SILC_GET32_MSB(mode_mask, tmp_mask); set_mask = TRUE; } diff --git a/apps/silcd/server.c b/apps/silcd/server.c index bb5b3b27..52bc4b70 100644 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@ -201,6 +201,8 @@ static void silc_server_packet_eos(SilcPacketEngine engine, if (server->router_conn && server->router_conn->sock == stream && !server->router && server->standalone) { + if (idata->sconn->callback) + (*idata->sconn->callback)(server, NULL, idata->sconn->callback_context); silc_server_create_connections(server); silc_server_free_sock_user_data(server, stream, NULL); } else { @@ -212,6 +214,8 @@ static void silc_server_packet_eos(SilcPacketEngine engine, server->backup_closed = TRUE; } + if (idata->sconn->callback) + (*idata->sconn->callback)(server, NULL, idata->sconn->callback_context); silc_server_free_sock_user_data(server, stream, NULL); } @@ -239,6 +243,8 @@ SILC_TASK_CALLBACK(silc_server_packet_error_timeout) server->backup_closed = TRUE; } + if (idata->sconn->callback) + (*idata->sconn->callback)(server, NULL, idata->sconn->callback_context); silc_server_free_sock_user_data(server, stream, NULL); } @@ -1322,7 +1328,8 @@ void silc_server_create_connection(SilcServer server, sconn->no_conf = dynamic; sconn->server = server; - SILC_LOG_DEBUG(("Created connection %p", sconn)); + SILC_LOG_DEBUG(("Created connection %p to %s:%d", sconn, + remote_host, port)); silc_schedule_task_add_timeout(server->schedule, silc_server_connect_router, sconn, 0, 0); @@ -1479,6 +1486,7 @@ silc_server_ke_auth_compl(SilcConnAuth connauth, SilcBool success, idata->status |= (SILC_IDLIST_STATUS_REGISTERED | SILC_IDLIST_STATUS_LOCAL); idata->sconn = sconn; + idata->sconn->callback = NULL; /* Statistics */ server->stat.my_routers++; @@ -2595,6 +2603,7 @@ silc_server_accept_auth_compl(SilcConnAuth connauth, SilcBool success, sconn->remote_port = port; silc_dlist_add(server->conns, sconn); idata->sconn = sconn; + idata->sconn->callback = NULL; idata->last_receive = time(NULL); /* Add the common data structure to the ID entry. */ diff --git a/apps/silcd/server_backup.c b/apps/silcd/server_backup.c index 0b6eae00..8f5140c1 100644 --- a/apps/silcd/server_backup.c +++ b/apps/silcd/server_backup.c @@ -786,6 +786,8 @@ SILC_TASK_CALLBACK(silc_server_backup_connected_again) SilcServer server = app_context; SilcServerConfigRouter *primary; + SILC_LOG_DEBUG(("Reconnecting")); + if (server->server_shutdown) return; @@ -813,6 +815,7 @@ void silc_server_backup_connected(SilcServer server, if (!server_entry) { /* Try again */ + SILC_LOG_DEBUG(("Connecting failed")); silc_schedule_task_add_timeout(server->schedule, silc_server_backup_connected_again, context, 5, 0);