From 280359665fe3f84beb9c2490b27ebe72f8d353a7 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Mon, 19 Feb 2007 14:44:37 +0000 Subject: [PATCH] Fixed various connect aborting crashes. --- lib/silcclient/client.c | 32 ++++++++++++++++++++------------ lib/silcclient/client_connect.c | 6 +++--- lib/silcclient/client_internal.h | 1 + 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/lib/silcclient/client.c b/lib/silcclient/client.c index c939fa7b..93200986 100644 --- a/lib/silcclient/client.c +++ b/lib/silcclient/client.c @@ -180,11 +180,16 @@ static void silc_client_connect_abort(SilcAsyncOperation op, void *context) /* Connection callback will not be called after user aborted connecting */ conn->callback = NULL; + conn->internal->cop = NULL; /* Signal to close connection */ if (!conn->internal->disconnected) { conn->internal->disconnected = TRUE; - SILC_FSM_EVENT_SIGNAL(&conn->internal->wait_event); + + /* If user aborts before connection machine is even up yet, then don't + send signal yet. It will process this event when it comes up. */ + if (silc_fsm_is_started(&conn->internal->fsm)) + SILC_FSM_EVENT_SIGNAL(&conn->internal->wait_event); } } @@ -208,7 +213,9 @@ SILC_FSM_STATE(silc_client_connection_st_start) silc_fsm_event_init(&conn->internal->wait_event, connfsm); silc_fsm_start_sync(connfsm, silc_client_connection_st_run); - /* Schedule any events set in initialization */ + /* Schedule any events possibly set in initialization */ + if (conn->internal->disconnected) + SILC_FSM_EVENT_SIGNAL(&conn->internal->wait_event); if (conn->internal->connect) SILC_FSM_EVENT_SIGNAL(&conn->internal->wait_event); if (conn->internal->key_exchange) @@ -233,6 +240,13 @@ SILC_FSM_STATE(silc_client_connection_st_run) /* Process events */ thread = &conn->internal->event_thread; + if (conn->internal->disconnected) { + /** Event: disconnected */ + SILC_LOG_DEBUG(("Event: disconnected")); + silc_fsm_next(fsm, silc_client_connection_st_close); + return SILC_FSM_YIELD; + } + if (conn->internal->connect) { SILC_LOG_DEBUG(("Event: connect")); conn->internal->connect = FALSE; @@ -269,13 +283,6 @@ SILC_FSM_STATE(silc_client_connection_st_run) return SILC_FSM_CONTINUE; } - if (conn->internal->disconnected) { - /** Event: disconnected */ - SILC_LOG_DEBUG(("Event: disconnected")); - silc_fsm_next(fsm, silc_client_connection_st_close); - return SILC_FSM_YIELD; - } - /* NOT REACHED */ SILC_ASSERT(FALSE); return SILC_FSM_CONTINUE; @@ -427,8 +434,9 @@ SILC_FSM_STATE(silc_client_connection_st_close) SILC_LOG_DEBUG(("Closing remote connection")); - /* Close connection */ - silc_packet_stream_destroy(conn->stream); + /* Close connection. */ + if (conn->stream) + silc_packet_stream_destroy(conn->stream); SILC_LOG_DEBUG(("Finishing connection machine")); return SILC_FSM_FINISH; @@ -853,7 +861,7 @@ silc_client_key_exchange(SilcClient client, callback(client, NULL, SILC_CLIENT_CONN_ERROR, 0, NULL, context); return NULL; } - conn->stream = (void *)stream; + conn->internal->user_stream = stream; /* Signal connection to start key exchange */ conn->internal->key_exchange = TRUE; diff --git a/lib/silcclient/client_connect.c b/lib/silcclient/client_connect.c index 57911639..95b0bff1 100644 --- a/lib/silcclient/client_connect.c +++ b/lib/silcclient/client_connect.c @@ -87,7 +87,7 @@ static void silc_client_connect_callback(SilcNetStatus status, /* Connection created successfully */ SILC_LOG_DEBUG(("Connected")); - conn->stream = (void *)stream; + conn->internal->user_stream = stream; SILC_FSM_CALL_CONTINUE(fsm); } @@ -438,7 +438,7 @@ SILC_FSM_STATE(silc_client_st_connect_set_stream) /* Create packet stream */ conn->stream = silc_packet_stream_create(client->internal->packet_engine, conn->internal->schedule, - (SilcStream)conn->stream); + conn->internal->user_stream); if (!conn->stream) { /** Cannot create packet stream */ SILC_LOG_DEBUG(("Could not create packet stream")); @@ -550,7 +550,7 @@ SILC_FSM_STATE(silc_client_st_connect_setup_udp) return SILC_FSM_CONTINUE; } -/* Resolved authentication method to be used in authentication protocol */ +/* Resolve authentication method to be used in authentication protocol */ SILC_FSM_STATE(silc_client_st_connect_auth_resolve) { diff --git a/lib/silcclient/client_internal.h b/lib/silcclient/client_internal.h index dd331196..c1208fba 100644 --- a/lib/silcclient/client_internal.h +++ b/lib/silcclient/client_internal.h @@ -136,6 +136,7 @@ struct SilcClientConnectionInternalStruct { SilcAsyncOperation op; /* Protocols async operation */ SilcAsyncOperation cop; /* Async operation for application */ SilcHashTable attrs; /* Configured user attributes */ + SilcStream user_stream; /* Low level stream in connecting */ char *disconnect_message; /* Disconnection message */ char *away_message; /* Away message */ void *prv_waiter; /* Private message packet waiter */ -- 2.24.0