Assure that endless loop with detached client resolving cannot
[silc.git] / apps / silcd / packet_receive.c
index b3828beb1a4b392db9fdfa1f1ea8c17b1f3904de..0725f7e86092c42623bb18a48d328dd106eed8fd 100644 (file)
@@ -1305,7 +1305,7 @@ void silc_server_notify(SilcServer server,
     silc_free(server_id);
 
     /* Sending SERVER_SIGNOFF is not right way to signoff local connection */
-    if (SILC_IS_LOCAL(server_entry))
+    if (SILC_IS_LOCAL(server_entry) || server_entry == server->id_entry)
       break;
 
     /* Remove all servers that are originated from this server, and
@@ -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--;