From: Pekka Riikonen Date: Fri, 18 Jun 2004 17:29:25 +0000 (+0000) Subject: Check for valid route when routing packets to local servers. X-Git-Tag: silc.server.0.9.19~68 X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=commitdiff_plain;h=ed49b2d819bdf25fb529c84f05b30bde508a6211 Check for valid route when routing packets to local servers. --- diff --git a/CHANGES b/CHANGES index 2fa3adb2..045ff608 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,9 @@ +Fri Jun 18 19:26:58 CEST 2004 Pekka Riikonen + + * Check for valid route when receiving packet from router and + when routing it to local server in the cell. A patch from + Matt Miller. Affected files silcd/router.c and server.c. + Sat May 1 13:55:54 CEST 2004 Patrik Weiskircher * Couldn't detach and reattach twice, because of the previous diff --git a/apps/silcd/route.c b/apps/silcd/route.c index 6c1e03d1..5488bb31 100644 --- a/apps/silcd/route.c +++ b/apps/silcd/route.c @@ -97,11 +97,11 @@ SilcSocketConnection silc_server_route_get(SilcServer server, void *id, #endif router = silc_server_route_check(dest, port); - if (!router) - return (SilcSocketConnection)server->id_entry->router->connection; - - return (SilcSocketConnection)router->connection; + if (router) + return (SilcSocketConnection)router->connection; } - return (SilcSocketConnection)server->id_entry->router->connection; + return (server->id_entry->router) + ? (SilcSocketConnection)server->id_entry->router->connection + : NULL; } diff --git a/apps/silcd/server.c b/apps/silcd/server.c index b8112b3b..3fc7db09 100644 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@ -2545,16 +2545,22 @@ SILC_TASK_CALLBACK(silc_server_packet_parse_real) packet->dst_id_type == SILC_ID_SERVER && sock->type != SILC_SOCKET_TYPE_CLIENT && memcmp(packet->dst_id, server->id_string, server->id_string_len)) { + SilcSocketConnection conn; /* Route the packet to fastest route for the destination ID */ void *id = silc_id_str2id(packet->dst_id, packet->dst_id_len, packet->dst_id_type); if (!id) goto out; - silc_server_packet_route(server, - silc_server_route_get(server, id, - packet->dst_id_type), - packet); + + conn = silc_server_route_get(server, id, packet->dst_id_type); + if (!conn) { + SILC_LOG_WARNING(("Packet to unknown server ID %s, dropped (no route)", + silc_id_render(id, SILC_ID_SERVER))); + goto out; + } + + silc_server_packet_route(server, conn, packet); silc_free(id); goto out; } @@ -5366,7 +5372,7 @@ silc_server_get_client_route(SilcServer server, dst_sock = silc_server_route_get(server, id, SILC_ID_CLIENT); silc_free(id); - if (idata) + if (idata && dst_sock) *idata = (SilcIDListData)dst_sock->user_data; return dst_sock; }