From: Pekka Riikonen Date: Thu, 16 Jan 2003 17:09:32 +0000 (+0000) Subject: Make sure the socket connection is not closed too early and X-Git-Tag: silc.client.0.9.11.2~4 X-Git-Url: http://git.silcnet.org/gitweb/?a=commitdiff_plain;h=14f43a8a3f18f7bb5ce3fcf4825b71430699b3be;p=silc.git Make sure the socket connection is not closed too early and make sure all protocol error callbacks close connections. --- diff --git a/CHANGES b/CHANGES index 40e06a57..1389e250 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,16 @@ +Thu Jan 16 18:47:00 EET 2003 Pekka Riikonen + + * 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 * Removed --session and --dummy options from Irssi SILC Client. diff --git a/apps/silcd/packet_send.c b/apps/silcd/packet_send.c index 8e3ab0f2..80d2d71b 100644 --- a/apps/silcd/packet_send.c +++ b/apps/silcd/packet_send.c @@ -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); diff --git a/apps/silcd/server.c b/apps/silcd/server.c index 7b216c20..f1f93da0 100644 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@ -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; }