Fixed SERVER_SIGNOFF notify handling on backup router.
authorPekka Riikonen <priikone@silcnet.org>
Mon, 16 Dec 2002 18:53:52 +0000 (18:53 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Mon, 16 Dec 2002 18:53:52 +0000 (18:53 +0000)
Backup router do not remove clients from locally connected
disconnecting servers but expects SERVER_SIGNOFF from router.

CHANGES
apps/silcd/idlist.c
apps/silcd/packet_receive.c
apps/silcd/packet_send.c
apps/silcd/server.c

diff --git a/CHANGES b/CHANGES
index 1a10bd751ea090965e043dd92a405001aee43b05..d960e2aa34838e3721026f16a13f4d724f5d23fa 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,25 @@
+Mon Dec 16 19:33:05 EET 2002  Pekka Riikonen <priikone@silcnet.org>
+
+       * Fixed double free in async host lookup code.  Affected file
+         lib/silcutil/silcsockconn.c.
+
+       * On backup router handle now the SERVER_SIGNOFF from router
+         for local connected servers too, and close the connections.
+
+         Do not process them as normally signing off servers when they
+         really signoff by sending EOF fe, but always assume that
+         router sends the SERVER_SIGNOFF.
+
+         Affected files silcd/server.c and silcd/packet_receive.c.
+
+       * Fixed socket unsetting when closing connections.  Affected
+         files silcd/server.c and silcd/packet_send.c.
+
+       * Do not print the nickname in SERVER_SIGNOFF if we do not
+         have it.  Prevents asserts in Irssi core.  It is possible we
+         don't have the nick if it was just being resolved when server
+         signoff.  Affected file irssi/src/silc/core/client_ops.c.
+
 Thu Dec 12 23:22:50 EET 2002  Pekka Riikonen <priikone@silcnet.org>
 
        * Fixed autonick crashbug in client library.  Affected file
index df7eba0a6cc5eeeaeb864c1e693c653afd68fc18..9acdd06844330fd6b2e7f93baaa55d344aa68687 100644 (file)
@@ -295,8 +295,10 @@ int silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry)
     if (!silc_idcache_del_by_context(id_list->servers, entry))
       return FALSE;
 
-    SILC_LOG_DEBUG(("Deleting server %s", entry->server_name ?
-                   entry->server_name : ""));
+    SILC_LOG_DEBUG(("Deleting server %s id %s", entry->server_name ?
+                   entry->server_name : "",
+                   entry->id ?
+                   silc_id_render(entry->id, SILC_ID_SERVER) : ""));
 
     /* Free data */
     silc_free(entry->server_name);
index 29744f2c08d240330b6a1bfd86309e9bf697ca10..1fa6f7525c74dd82fb82c65aef3e09621d71188e 100644 (file)
@@ -1306,9 +1306,20 @@ 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))
+    /* For local entrys SERVER_SIGNOFF is processed only on backup router.
+       It is possible that router sends server signoff for a server.  If
+       backup router has it as local connection it will be closed. */
+    if (SILC_IS_LOCAL(server_entry) &&
+       server->server_type == SILC_BACKUP_ROUTER) {
+      sock = server_entry->connection;
+      SILC_LOG_DEBUG(("Closing connection %s after SERVER_SIGNOFF",
+                     sock->hostname));
+      SILC_SET_DISCONNECTING(sock);
+      if (sock->user_data)
+       silc_server_free_sock_user_data(server, sock, NULL);
+      silc_server_close_connection(server, sock);
       break;
+    }
 
     /* Remove all servers that are originated from this server, and
        remove the clients of those servers too. */
index d8d27c7b750a86c9dd5e2fbfea60cfe5771fb3b6..8e3ab0f248742ce3a308a3074059467eb3aec13b 100644 (file)
@@ -38,12 +38,24 @@ int silc_server_packet_send_real(SilcServer server,
   if (SILC_IS_DISCONNECTING(sock))
     return -1;
 
-  /* We do not force anymore packet sending */
-  force_send = FALSE;
-
   /* Send the packet */
-  ret = silc_packet_send(sock, force_send);
+  ret = silc_packet_send(sock, FALSE);
   if (ret != -2) {
+    if (ret == -1) {
+      SILC_LOG_ERROR(("Error sending packet to connection "
+                     "%s:%d [%s]", sock->hostname, sock->port,
+                     (sock->type == SILC_SOCKET_TYPE_UNKNOWN ? "Unknown" :
+                      sock->type == SILC_SOCKET_TYPE_CLIENT ? "Client" :
+                      sock->type == SILC_SOCKET_TYPE_SERVER ? "Server" :
+                      "Router")));
+
+      SILC_SET_DISCONNECTING(sock);
+      if (sock->user_data)
+       silc_server_free_sock_user_data(server, sock, NULL);
+      silc_server_close_connection(server, sock);
+      return ret;
+    }
+
     server->stat.packets_sent++;
     return ret;
   }
@@ -1995,7 +2007,6 @@ void silc_server_packet_queue_purge(SilcServer server,
       (SILC_IS_DISCONNECTED(sock) == FALSE)) {
     server->stat.packets_sent++;
     silc_packet_send(sock, TRUE);
-    SILC_SET_CONNECTION_FOR_INPUT(server->schedule, sock->sock);
     SILC_UNSET_OUTBUF_PENDING(sock);
     silc_buffer_clear(sock->outbuf);
   }
index d7f338387292656c05fcfaff2a7ef9520ee47a9d..539b9d30ab7698e0d43abcc73206440e4c4f91ae 100644 (file)
@@ -2929,6 +2929,8 @@ void silc_server_close_connection(SilcServer server,
   char tmp[128];
 
   if (!server->sockets[sock->sock] && SILC_IS_DISCONNECTED(sock)) {
+    silc_schedule_unset_listen_fd(server->schedule, sock->sock);
+    silc_schedule_task_del_by_fd(server->schedule, sock->sock);
     silc_schedule_task_add(server->schedule, sock->sock,
                           silc_server_close_connection_final,
                           (void *)sock, 0, 1, SILC_TASK_TIMEOUT,
@@ -2945,9 +2947,6 @@ void silc_server_close_connection(SilcServer server,
                    sock->type == SILC_SOCKET_TYPE_SERVER ? "Server" :
                    "Router"), tmp[0] ? tmp : ""));
 
-  /* We won't listen for this connection anymore */
-  silc_schedule_unset_listen_fd(server->schedule, sock->sock);
-
   /* Unregister all tasks */
   silc_schedule_task_del_by_fd(server->schedule, sock->sock);
 
@@ -2972,6 +2971,9 @@ void silc_server_close_connection(SilcServer server,
     }
   }
 
+  /* We won't listen for this connection anymore */
+  silc_schedule_unset_listen_fd(server->schedule, sock->sock);
+
   silc_schedule_task_add(server->schedule, sock->sock,
                         silc_server_close_connection_final,
                         (void *)sock, 0, 1, SILC_TASK_TIMEOUT,
@@ -3209,11 +3211,15 @@ void silc_server_free_sock_user_data(SilcServer server,
                               SILC_TASK_PRI_NORMAL);
       }
 
+      SILC_SERVER_SEND_OPERS(server, FALSE, TRUE, SILC_NOTIFY_TYPE_NONE,
+                            ("Server %s signoff", user_data->server_name));
+
       if (!backup_router) {
        /* Remove all servers that are originated from this server, and
           remove the clients of those servers too. */
        silc_server_remove_servers_by_server(server, user_data, TRUE);
 
+#if 0
        /* Remove the clients that this server owns as they will become
           invalid now too.  For backup router the server is actually
           coming from the primary router, so mark that as the owner
@@ -3223,6 +3229,7 @@ void silc_server_free_sock_user_data(SilcServer server,
          silc_server_remove_clients_by_server(server, server->router,
                                               user_data, TRUE);
        else
+#endif
          silc_server_remove_clients_by_server(server, user_data,
                                               user_data, TRUE);