projects
/
silc.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
The silc_client_connect_to_[server|client] and
[silc.git]
/
lib
/
silcclient
/
client_connect.c
diff --git
a/lib/silcclient/client_connect.c
b/lib/silcclient/client_connect.c
index 98b4372f3a698bb71f0a1e0ea255fa37b1a8d036..8c1491943b9f91518a6a19c66528cd0923eebd97 100644
(file)
--- a/
lib/silcclient/client_connect.c
+++ b/
lib/silcclient/client_connect.c
@@
-32,6
+32,12
@@
static void silc_client_connect_callback(SilcNetStatus status,
SilcClientConnection conn = silc_fsm_get_context(fsm);
SilcClient client = conn->client;
SilcClientConnection conn = silc_fsm_get_context(fsm);
SilcClient client = conn->client;
+ if (conn->internal->aborted) {
+ silc_fsm_next(fsm, silc_client_st_connect_error);
+ SILC_FSM_CALL_CONTINUE(fsm);
+ return;
+ }
+
conn->internal->op = NULL;
if (conn->internal->verbose) {
switch (status) {
conn->internal->op = NULL;
if (conn->internal->verbose) {
switch (status) {
@@
-121,6
+127,14
@@
static void silc_client_ke_verify_key(SilcSKE ske,
SilcClient client = conn->client;
VerifyKeyContext verify;
SilcClient client = conn->client;
VerifyKeyContext verify;
+ if (conn->internal->aborted) {
+ completion(ske, SILC_SKE_STATUS_UNSUPPORTED_PUBLIC_KEY,
+ completion_context);
+ silc_fsm_next(fsm, silc_client_st_connect_error);
+ SILC_FSM_CALL_CONTINUE(fsm);
+ return;
+ }
+
/* If we provided repository for SKE and we got here the key was not
found from the repository. */
if (conn->internal->params.repository &&
/* If we provided repository for SKE and we got here the key was not
found from the repository. */
if (conn->internal->params.repository &&
@@
-164,6
+178,13
@@
static void silc_client_ke_completion(SilcSKE ske,
SilcCipher send_key, receive_key;
SilcHmac hmac_send, hmac_receive;
SilcCipher send_key, receive_key;
SilcHmac hmac_send, hmac_receive;
+ if (conn->internal->aborted) {
+ silc_ske_free_rekey_material(rekey);
+ silc_fsm_next(fsm, silc_client_st_connect_error);
+ SILC_FSM_CALL_CONTINUE(fsm);
+ return;
+ }
+
conn->internal->op = NULL;
if (status != SILC_SKE_STATUS_OK) {
/* Key exchange failed */
conn->internal->op = NULL;
if (status != SILC_SKE_STATUS_OK) {
/* Key exchange failed */
@@
-307,6
+328,13
@@
static void silc_client_connect_auth_completion(SilcConnAuth connauth,
SilcClientConnection conn = silc_fsm_get_context(fsm);
SilcClient client = conn->client;
SilcClientConnection conn = silc_fsm_get_context(fsm);
SilcClient client = conn->client;
+ if (conn->internal->aborted) {
+ silc_fsm_next(fsm, silc_client_st_connect_error);
+ SILC_FSM_CALL_CONTINUE(fsm);
+ return;
+ }
+
+ conn->internal->op = NULL;
silc_connauth_free(connauth);
if (!success) {
silc_connauth_free(connauth);
if (!success) {
@@
-400,6
+428,12
@@
SILC_FSM_STATE(silc_client_st_connect_set_stream)
SilcClientConnection conn = fsm_context;
SilcClient client = conn->client;
SilcClientConnection conn = fsm_context;
SilcClient client = conn->client;
+ if (conn->internal->disconnected) {
+ /** Disconnected */
+ silc_fsm_next(fsm, silc_client_st_connect_error);
+ return SILC_FSM_CONTINUE;
+ }
+
/* Create packet stream */
conn->stream = silc_packet_stream_create(client->internal->packet_engine,
conn->internal->schedule,
/* Create packet stream */
conn->stream = silc_packet_stream_create(client->internal->packet_engine,
conn->internal->schedule,
@@
-484,6
+518,12
@@
SILC_FSM_STATE(silc_client_st_connect_setup_udp)
SILC_LOG_DEBUG(("Setup UDP SILC session"));
SILC_LOG_DEBUG(("Setup UDP SILC session"));
+ if (conn->internal->disconnected) {
+ /** Disconnected */
+ silc_fsm_next(fsm, silc_client_st_connect_error);
+ return SILC_FSM_CONTINUE;
+ }
+
/* Create new UDP stream */
prop = silc_ske_get_security_properties(conn->internal->ske);
stream = silc_net_udp_connect(conn->internal->params.local_ip,
/* Create new UDP stream */
prop = silc_ske_get_security_properties(conn->internal->ske);
stream = silc_net_udp_connect(conn->internal->params.local_ip,
@@
-522,6
+562,12
@@
SILC_FSM_STATE(silc_client_st_connect_auth)
SILC_LOG_DEBUG(("Get authentication data"));
SILC_LOG_DEBUG(("Get authentication data"));
+ if (conn->internal->disconnected) {
+ /** Disconnected */
+ silc_fsm_next(fsm, silc_client_st_connect_error);
+ return SILC_FSM_CONTINUE;
+ }
+
silc_fsm_next(fsm, silc_client_st_connect_auth_start);
/* If authentication data not provided, ask from application */
silc_fsm_next(fsm, silc_client_st_connect_auth_start);
/* If authentication data not provided, ask from application */
@@
-549,6
+595,12
@@
SILC_FSM_STATE(silc_client_st_connect_auth_start)
SILC_LOG_DEBUG(("Starting connection authentication protocol"));
SILC_LOG_DEBUG(("Starting connection authentication protocol"));
+ if (conn->internal->disconnected) {
+ /** Disconnected */
+ silc_fsm_next(fsm, silc_client_st_connect_error);
+ return SILC_FSM_CONTINUE;
+ }
+
/* Allocate connection authentication protocol */
connauth = silc_connauth_alloc(conn->internal->schedule,
conn->internal->ske,
/* Allocate connection authentication protocol */
connauth = silc_connauth_alloc(conn->internal->schedule,
conn->internal->ske,
@@
-579,11
+631,17
@@
SILC_FSM_STATE(silc_client_st_connected)
SilcClientConnection conn = fsm_context;
SilcClient client = conn->client;
SilcClientConnection conn = fsm_context;
SilcClient client = conn->client;
- SILC_LOG_DEBUG(("Connection established"));
-
silc_ske_free(conn->internal->ske);
conn->internal->ske = NULL;
silc_ske_free(conn->internal->ske);
conn->internal->ske = NULL;
+ if (conn->internal->disconnected) {
+ /** Disconnected */
+ silc_fsm_next(fsm, silc_client_st_connect_error);
+ return SILC_FSM_CONTINUE;
+ }
+
+ SILC_LOG_DEBUG(("Connection established"));
+
/* Install rekey timer */
silc_schedule_task_add_timeout(conn->internal->schedule,
silc_client_rekey_timer, conn,
/* Install rekey timer */
silc_schedule_task_add_timeout(conn->internal->schedule,
silc_client_rekey_timer, conn,
@@
-648,6
+706,7
@@
SILC_TASK_CALLBACK(silc_client_rekey_timer)
SilcClientConnection conn = context;
/* Signal to start rekey */
SilcClientConnection conn = context;
/* Signal to start rekey */
+ conn->internal->rekey_responder = FALSE;
conn->internal->rekeying = TRUE;
SILC_FSM_SEMA_POST(&conn->internal->wait_event);
conn->internal->rekeying = TRUE;
SILC_FSM_SEMA_POST(&conn->internal->wait_event);
@@
-666,6
+725,9
@@
SILC_FSM_STATE(silc_client_st_rekey)
SILC_LOG_DEBUG(("Rekey"));
SILC_LOG_DEBUG(("Rekey"));
+ if (conn->internal->disconnected)
+ return SILC_FSM_FINISH;
+
/* Allocate SKE */
conn->internal->ske =
silc_ske_alloc(client->rng, conn->internal->schedule,
/* Allocate SKE */
conn->internal->ske =
silc_ske_alloc(client->rng, conn->internal->schedule,