Make sure the socket connection is not closed too early and
authorPekka Riikonen <priikone@silcnet.org>
Thu, 16 Jan 2003 17:09:32 +0000 (17:09 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Thu, 16 Jan 2003 17:09:32 +0000 (17:09 +0000)
make sure all protocol error callbacks close connections.

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

diff --git a/CHANGES b/CHANGES
index 40e06a573d6a5aa62c0b3464bf5563474afb66ea..1389e250a7621a5fab8d5c4d9b1c4703ea984706 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,16 @@
+Thu Jan 16 18:47:00 EET 2003  Pekka Riikonen <priikone@silcnet.org>
+
+       * Added better compiler and compiler flags checking in
+         configure.
+
+       * Check that socket is valid after QoS is applied to data.
+         Affected file lib/silcutil/unix/silcunixsockconn.c.
+
+       * Make sure the socket connecetion is not closed to early
+         when closing connection in server.  Also make sure the
+         connection is always closed after error in a protocol.
+         Affected file silcd/server.c.
+
 Wed Jan 15 11:03:36 CET 2003  Pekka Riikonen <priikone@silcnet.org>
 
        * Removed --session and --dummy options from Irssi SILC Client.
index 8e3ab0f248742ce3a308a3074059467eb3aec13b..80d2d71bfc73cc91b48ddaeb8a40a13fb39f8d00 100644 (file)
@@ -2005,6 +2005,7 @@ void silc_server_packet_queue_purge(SilcServer server,
 {
   if (sock && SILC_IS_OUTBUF_PENDING(sock) && 
       (SILC_IS_DISCONNECTED(sock) == FALSE)) {
+    SILC_LOG_DEBUG(("Purging ourgoing queue"));
     server->stat.packets_sent++;
     silc_packet_send(sock, TRUE);
     SILC_UNSET_OUTBUF_PENDING(sock);
index 7b216c20fdf9fcae09e135e98ca75885851d9127..f1f93da0d916d6b8158cae7ed7cca58a859bc523 100644 (file)
@@ -2289,6 +2289,7 @@ SILC_TASK_CALLBACK(silc_server_packet_process)
     if (SILC_PRIMARY_ROUTE(server) == sock && server->backup_router)
       server->backup_noswitch = TRUE;
 
+    SILC_SET_DISCONNECTING(sock);
     if (sock->user_data)
       silc_server_free_sock_user_data(server, sock, NULL);
     silc_server_close_connection(server, sock);
@@ -2433,6 +2434,7 @@ bool silc_server_packet_parse(SilcPacketParserContext *parser_context,
       if (SILC_PRIMARY_ROUTE(server) == sock && server->backup_router)
        server->backup_noswitch = TRUE;
 
+      SILC_SET_DISCONNECTING(sock);
       if (sock->user_data)
        silc_server_free_sock_user_data(server, sock, NULL);
       silc_server_close_connection(server, sock);
@@ -2502,6 +2504,7 @@ void silc_server_packet_parse_type(SilcServer server,
       silc_free(message);
 
       /* Handle the disconnection from our end too */
+      SILC_SET_DISCONNECTING(sock);
       if (sock->user_data && SILC_IS_LOCAL(sock->user_data))
        silc_server_free_sock_user_data(server, sock, NULL);
       silc_server_close_connection(server, sock);
@@ -2931,6 +2934,7 @@ void silc_server_close_connection(SilcServer server,
   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_net_close_connection(sock->sock);
     silc_schedule_task_add(server->schedule, sock->sock,
                           silc_server_close_connection_final,
                           (void *)sock, 0, 1, SILC_TASK_TIMEOUT,
@@ -2950,8 +2954,6 @@ void silc_server_close_connection(SilcServer server,
   /* Unregister all tasks */
   silc_schedule_task_del_by_fd(server->schedule, sock->sock);
 
-  /* Close the actual connection */
-  silc_net_close_connection(sock->sock);
   server->sockets[sock->sock] = NULL;
 
   /* If sock->user_data is NULL then we'll check for active protocols
@@ -2971,6 +2973,9 @@ void silc_server_close_connection(SilcServer server,
     }
   }
 
+  /* Close the actual connection */
+  silc_net_close_connection(sock->sock);
+
   /* We won't listen for this connection anymore */
   silc_schedule_unset_listen_fd(server->schedule, sock->sock);
 
@@ -2993,8 +2998,13 @@ void silc_server_disconnect_remote(SilcServer server,
   char *cp;
   int len;
 
-  if (!sock || SILC_IS_DISCONNECTED(sock))
+  if (!sock)
+    return;
+
+  if (SILC_IS_DISCONNECTED(sock)) {
+    silc_server_close_connection(server, sock);
     return;
+  }
 
   memset(buf, 0, sizeof(buf));
   va_start(ap, status);
@@ -5063,7 +5073,7 @@ SILC_TASK_CALLBACK_GLOBAL(silc_server_rekey_final)
       protocol->state == SILC_PROTOCOL_STATE_FAILURE) {
     /* Error occured during protocol */
     SILC_LOG_ERROR(("Error occurred during rekey protocol with "
-                  "%s (%s)", sock->hostname, sock->ip));
+                   "%s (%s)", sock->hostname, sock->ip));
     silc_protocol_cancel(protocol, server->schedule);
     silc_protocol_free(protocol);
     sock->protocol = NULL;
@@ -5072,6 +5082,19 @@ SILC_TASK_CALLBACK_GLOBAL(silc_server_rekey_final)
     if (ctx->ske)
       silc_ske_free(ctx->ske);
     silc_free(ctx);
+
+    /* Reconnect */
+    SILC_SET_DISCONNECTING(sock);
+    server->backup_noswitch = TRUE;
+    if (sock->user_data)
+      silc_server_free_sock_user_data(server, sock, NULL);
+    silc_server_close_connection(server, sock);
+    silc_schedule_task_add(server->schedule, 0,
+                          silc_server_connect_to_router,
+                          server, 1, 0,
+                          SILC_TASK_TIMEOUT,
+                          SILC_TASK_PRI_NORMAL);
+
     return;
   }