Check for valid route when routing packets to local servers.
authorPekka Riikonen <priikone@silcnet.org>
Fri, 18 Jun 2004 17:29:25 +0000 (17:29 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Fri, 18 Jun 2004 17:29:25 +0000 (17:29 +0000)
CHANGES
apps/silcd/route.c
apps/silcd/server.c

diff --git a/CHANGES b/CHANGES
index 2fa3adb28e83fca8080daf489c0ac0a95214ec54..045ff6089ac31c0d3f432857106c8ab0229edaf5 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,9 @@
+Fri Jun 18 19:26:58 CEST 2004  Pekka Riikonen <priikone@silcnet.org>
+
+       * 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 <pat@icore.at>
 
        * Couldn't detach and reattach twice, because of the previous
index 6c1e03d1c7971bcbcdd6f24d1a59354bfca73ebe..5488bb315659a5417fbaf692ecbf5ae8b065e807 100644 (file)
@@ -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;
 }
index b8112b3bcf23ff5a1fc700ef11a494faa4c412ec..3fc7db09c961eb56cf63d6f426fe521cc51a01ed 100644 (file)
@@ -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;
     }