From: Pekka Riikonen Date: Wed, 24 Sep 2008 14:56:56 +0000 (+0300) Subject: Disconnect problem: Mark incoming connections immediately local X-Git-Tag: silc.server.1.1.13~1 X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=commitdiff_plain;h=8bb22be757768c18af7a5381b3b18d4983dfa9d4 Disconnect problem: Mark incoming connections immediately local This fixes the problem of SKE remaining running in the background even though the conncection is closed because it was never aborted because the connection wasn't marked local. After SKE timeout a crash may occur. --- diff --git a/apps/silcd/server.c b/apps/silcd/server.c index 52bc4b70..c2df082c 100644 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@ -201,7 +201,7 @@ static void silc_server_packet_eos(SilcPacketEngine engine, if (server->router_conn && server->router_conn->sock == stream && !server->router && server->standalone) { - if (idata->sconn->callback) + if (idata->sconn && idata->sconn->callback) (*idata->sconn->callback)(server, NULL, idata->sconn->callback_context); silc_server_create_connections(server); silc_server_free_sock_user_data(server, stream, NULL); @@ -214,7 +214,7 @@ static void silc_server_packet_eos(SilcPacketEngine engine, server->backup_closed = TRUE; } - if (idata->sconn->callback) + if (idata->sconn && idata->sconn->callback) (*idata->sconn->callback)(server, NULL, idata->sconn->callback_context); silc_server_free_sock_user_data(server, stream, NULL); } @@ -243,7 +243,7 @@ SILC_TASK_CALLBACK(silc_server_packet_error_timeout) server->backup_closed = TRUE; } - if (idata->sconn->callback) + if (idata->sconn && idata->sconn->callback) (*idata->sconn->callback)(server, NULL, idata->sconn->callback_context); silc_server_free_sock_user_data(server, stream, NULL); } @@ -1599,9 +1599,9 @@ static void silc_server_ke_completed(SilcSKE ske, SilcSKEStatus status, { SilcPacketStream sock = context; SilcUnknownEntry entry = silc_packet_get_context(sock); - SilcServerConnection sconn = entry->data.sconn; - SilcServer server = entry->server; - SilcServerConfigRouter *conn = sconn->conn.ref_ptr; + SilcServerConnection sconn; + SilcServer server; + SilcServerConfigRouter *conn; SilcAuthMethod auth_meth = SILC_AUTH_NONE; void *auth_data = NULL; SilcUInt32 auth_data_len = 0; @@ -1610,10 +1610,13 @@ static void silc_server_ke_completed(SilcSKE ske, SilcSKEStatus status, SilcHmac hmac_send, hmac_receive; SilcHash hash; - SILC_LOG_DEBUG(("Connection %p, SKE completed, entry %p", sconn, entry)); - + server = entry->server; + sconn = entry->data.sconn; + conn = sconn->conn.ref_ptr; entry->op = NULL; + SILC_LOG_DEBUG(("Connection %p, SKE completed, entry %p", sconn, entry)); + if (status != SILC_SKE_STATUS_OK) { /* SKE failed */ SILC_LOG_ERROR(("Error (%s) during Key Exchange protocol with %s (%s)", @@ -2818,6 +2821,7 @@ static void silc_server_accept_new_connection(SilcNetStatus status, entry->port = port; entry->server = server; entry->data.conn_type = SILC_CONN_UNKNOWN; + entry->data.status |= SILC_IDLIST_STATUS_LOCAL; silc_packet_set_context(packet_stream, entry); SILC_LOG_DEBUG(("Created unknown connection %p", entry));