X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Fsilcd%2Fserver.c;h=4ac168f004c8bb514db393d2a775aae10e4f3a7e;hb=e1459c7b692417464cf23b820ab74c98b0c36f25;hp=d711caf35bea58c1c49ca6dd1cd1d4e8f5244b3c;hpb=565b435fdbcd9369cf8b18ce3265ddff3c9e5a2b;p=silc.git diff --git a/apps/silcd/server.c b/apps/silcd/server.c index d711caf3..4ac168f0 100644 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@ -2235,6 +2235,12 @@ SILC_TASK_CALLBACK(silc_server_packet_process) /* If processing failed the connection is closed. */ if (!ret) { + /* On packet processing errors we may close our primary router + connection but won't become primary router if we are the backup + since this is local error condition. */ + if (SILC_PRIMARY_ROUTE(server) == sock && server->backup_router) + server->backup_noswitch = TRUE; + if (sock->user_data) silc_server_free_sock_user_data(server, sock, NULL); silc_server_close_connection(server, sock); @@ -2340,6 +2346,7 @@ bool silc_server_packet_parse(SilcPacketParserContext *parser_context, SilcServer server = (SilcServer)context; SilcSocketConnection sock = parser_context->sock; SilcIDListData idata = (SilcIDListData)sock->user_data; + bool ret; if (idata) idata->psn_receive = parser_context->packet->sequence + 1; @@ -2360,14 +2367,29 @@ bool silc_server_packet_parse(SilcPacketParserContext *parser_context, the idata->receive_key might have become valid in the last packet and we want to call this processor with valid cipher. */ if (idata) - silc_packet_receive_process(sock, server->server_type == SILC_ROUTER ? + ret = silc_packet_receive_process( + sock, server->server_type == SILC_ROUTER ? TRUE : FALSE, idata->receive_key, idata->hmac_receive, idata->psn_receive, silc_server_packet_parse, server); else - silc_packet_receive_process(sock, server->server_type == SILC_ROUTER ? + ret = silc_packet_receive_process( + sock, server->server_type == SILC_ROUTER ? TRUE : FALSE, NULL, NULL, 0, silc_server_packet_parse, server); + + if (!ret) { + /* On packet processing errors we may close our primary router + connection but won't become primary router if we are the backup + since this is local error condition. */ + if (SILC_PRIMARY_ROUTE(server) == sock && server->backup_router) + server->backup_noswitch = TRUE; + + if (sock->user_data) + silc_server_free_sock_user_data(server, sock, NULL); + silc_server_close_connection(server, sock); + } + return FALSE; } @@ -3077,7 +3099,7 @@ void silc_server_free_sock_user_data(SilcServer server, sock->type != SILC_SOCKET_TYPE_ROUTER) backup_router = NULL; - if (server->server_shutdown) + if (server->server_shutdown || server->backup_noswitch) backup_router = NULL; /* If this was our primary router connection then we're lost to @@ -3202,6 +3224,7 @@ void silc_server_free_sock_user_data(SilcServer server, server->server_name, server->router->server_name)); } + server->backup_noswitch = FALSE; /* Free the server entry */ silc_server_backup_del(server, user_data);