X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Fsilcd%2Fserver.c;h=6543828594e7ae6839715c16868684172c95be7d;hb=83c73dffa89141bc59e62436abb63b3d3efca6bb;hp=f7918f7d4458ff2c71c1fc1738f47731ffea472c;hpb=e2890b9b6f74ba4ab2f4ac67658f5c0fea4380b3;p=silc.git diff --git a/apps/silcd/server.c b/apps/silcd/server.c index f7918f7d..65438285 100644 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@ -1650,7 +1650,7 @@ SILC_TASK_CALLBACK(silc_server_packet_parse_real) /* Parser callback called by silc_packet_receive_process. This merely registers timeout that will handle the actual parsing when appropriate. */ -void silc_server_packet_parse(SilcPacketParserContext *parser_context, +bool silc_server_packet_parse(SilcPacketParserContext *parser_context, void *context) { SilcServer server = (SilcServer)context; @@ -1660,6 +1660,31 @@ void silc_server_packet_parse(SilcPacketParserContext *parser_context, if (idata) idata->psn_receive = parser_context->packet->sequence + 1; + /* If protocol for this connection is key exchange or rekey then we'll + process all packets synchronously, since there might be packets in + queue that we are not able to decrypt without first processing the + packets before them. */ + if (sock->protocol && sock->protocol->protocol && + (sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_KEY_EXCHANGE || + sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY)) { + silc_server_packet_parse_real(server->schedule, 0, sock->sock, + parser_context); + + /* Reprocess data since we'll return FALSE here. This is because + 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 ? + 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 ? + TRUE : FALSE, NULL, NULL, 0, + silc_server_packet_parse, server); + return FALSE; + } + switch (sock->type) { case SILC_SOCKET_TYPE_UNKNOWN: case SILC_SOCKET_TYPE_CLIENT: @@ -1680,8 +1705,10 @@ void silc_server_packet_parse(SilcPacketParserContext *parser_context, SILC_TASK_PRI_NORMAL); break; default: - return; + return TRUE; } + + return TRUE; } /* Parses the packet type and calls what ever routines the packet type