Assure that endless loop with detached client resolving cannot
authorPekka Riikonen <priikone@silcnet.org>
Tue, 10 Sep 2002 07:51:23 +0000 (07:51 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Tue, 10 Sep 2002 07:51:23 +0000 (07:51 +0000)
happen.

CHANGES
TODO
apps/silcd/idlist.h
apps/silcd/packet_receive.c

diff --git a/CHANGES b/CHANGES
index 6e59cd83e46b3de57928ac1985314dcddcbe9132..52d12616e444165877012340d5cb4615c89de82e 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,10 @@
+Tue Sep 10 09:50:08 CEST 2002  Pekka Riikonen <priikone@silcnet.org>
+
+       * Assure that endless loop cannot happen with detached client
+         resolving on normal server.  Added idlist status
+         SILC_IDLIST_STATUS_RESUME_RES.   Affected files are
+         silcd/idlist.h and silcd/packet_receive.c.
+
 Mon Sep  9 12:18:18 CEST 2002  Pekka Riikonen <priikone@silcnet.org>
 
        * Incoming file transfer request cannot use same session as
diff --git a/TODO b/TODO
index 1827c82a3ce020bdb29828b6847b0eb9b88e89a8..09bc72497311ec945c386d811e61de8166a0a095 100644 (file)
--- a/TODO
+++ b/TODO
@@ -26,9 +26,6 @@ TODO/bugs In SILC Client Library
 TODO/bugs In SILC Server
 ========================
 
- o Possibility of endless loop with detached client resolving in server.
-   Has happened once.  Check the logic.
-
  o Backup router can accidently free its own id_entry and ID?  Could happen
    when some server is connecting and connecting fails (like too many
    connections, etc).  Some weird crashes relating to this occurred.
index ec10bc5921110c382282d1702462185e4192b011..64171f7d9adacefcd50d4a8ae5fd7bfcf6fdb530 100644 (file)
@@ -64,6 +64,8 @@ typedef SilcUInt8 SilcIDListStatus;
 #define SILC_IDLIST_STATUS_DISABLED     0x08    /* Entry is disabled */
 #define SILC_IDLIST_STATUS_RESUMED      0x10    /* Entry is resumed */
 #define SILC_IDLIST_STATUS_LOCAL        0x20    /* Entry locally connected */
+#define SILC_IDLIST_STATUS_RESUME_RES   0x40    /* Entry resolved while
+                                                  resuming */
 
 /*
    Generic ID list data structure.
index 525ada9d0d9d57112830a826989048cf698b0467..0725f7e86092c42623bb18a48d328dd106eed8fd 100644 (file)
@@ -3385,6 +3385,8 @@ SILC_SERVER_CMD_FUNC(resume_resolve)
        silc_server_free_sock_user_data(server, sock, NULL);
       goto out;
     }
+
+    client->data.status |= SILC_IDLIST_STATUS_RESUME_RES;
   }
 
   /* Reprocess the packet */
@@ -3492,6 +3494,8 @@ void silc_server_resume_client(SilcServer server,
       resolve = TRUE;
     if (!detached_client->nickname)
       resolve = TRUE;
+    if (detached_client->data.status & SILC_IDLIST_STATUS_RESUME_RES)
+      resolve = FALSE;
 
     if (resolve) {
       if (server->server_type == SILC_SERVER && !server->standalone) {
@@ -3611,6 +3615,7 @@ void silc_server_resume_client(SilcServer server,
     silc_idlist_add_data(detached_client, idata);
     detached_client->data.status |= SILC_IDLIST_STATUS_REGISTERED;
     detached_client->data.status |= SILC_IDLIST_STATUS_RESUMED;
+    detached_client->data.status &= ~SILC_IDLIST_STATUS_RESUME_RES;
     detached_client->mode &= ~SILC_UMODE_DETACHED;
     server->stat.my_detached--;