From 8476b4bc5d912c2aa86672f8fa8caa089898f6b6 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Mon, 26 Nov 2001 14:01:35 +0000 Subject: [PATCH] updates --- CHANGES | 11 +++++++++++ lib/silcclient/client_keyagr.c | 11 ++++++++--- lib/silcclient/idlist.c | 2 ++ lib/silcclient/silcapi.h | 4 +++- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index e90f9225..12fa4ae5 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,14 @@ +Mon Nov 26 15:01:53 CET 2001 Pekka Riikonen + + * If client entry is deleted with active key agreement + session, abort the session. + + The silc_client_abort_key_agreement now calls the completion + callback with new SILC_KEY_AGREEMENT_ABORTED status. + + Affected file lib/silcclient/silcapi.h, client_keyagr.c and + idlist.c. + Sun Nov 25 18:01:45 EET 2001 Pekka Riikonen * Don't use __restrict in older GCC's. Affected file is diff --git a/lib/silcclient/client_keyagr.c b/lib/silcclient/client_keyagr.c index 20bb4b34..b21a7dc7 100644 --- a/lib/silcclient/client_keyagr.c +++ b/lib/silcclient/client_keyagr.c @@ -616,16 +616,21 @@ void silc_client_abort_key_agreement(SilcClient client, assert(client_entry); if (client_entry->ke) { + SilcClientKeyAgreement ke; + if (client_entry->ke->sock) { silc_client_del_socket(client_entry->ke->client, client_entry->ke->sock); silc_socket_free(client_entry->ke->sock); } - client_entry->ke = NULL; silc_schedule_task_del_by_fd(client->schedule, client_entry->ke->fd); if (client_entry->ke->timeout) silc_schedule_task_del(client->schedule, - client_entry->ke->timeout); - silc_free(client_entry->ke); + client_entry->ke->timeout); + ke = client_entry->ke; + client_entry->ke = NULL; + ke->completion(client, conn, client_entry, + SILC_KEY_AGREEMENT_ABORTED, NULL, ke->context); + silc_free(ke); } } diff --git a/lib/silcclient/idlist.c b/lib/silcclient/idlist.c index 8ec66929..02f54cee 100644 --- a/lib/silcclient/idlist.c +++ b/lib/silcclient/idlist.c @@ -653,6 +653,8 @@ void silc_client_del_client_entry(SilcClient client, silc_cipher_free(client_entry->receive_key); silc_free(client_entry->key); silc_client_ftp_session_free_client(conn, client_entry); + if (client_entry->ke) + silc_client_abort_key_agreement(client, conn, client_entry); silc_free(client_entry); } diff --git a/lib/silcclient/silcapi.h b/lib/silcclient/silcapi.h index 61587e3d..03387ebf 100644 --- a/lib/silcclient/silcapi.h +++ b/lib/silcclient/silcapi.h @@ -74,6 +74,7 @@ typedef enum { SILC_KEY_AGREEMENT_ERROR, /* Unknown error occurred */ SILC_KEY_AGREEMENT_FAILURE, /* The protocol failed */ SILC_KEY_AGREEMENT_TIMEOUT, /* The protocol timeout */ + SILC_KEY_AGREEMENT_ABORTED, /* The protocol aborted */ } SilcKeyAgreementStatus; /***/ @@ -1702,7 +1703,8 @@ void silc_client_perform_key_agreement_fd(SilcClient client, * before the key agreement protocol has been performed. After it has * been performed the library will automatically unbind the port. The * `client_entry' is the client to which we sent the key agreement - * request. + * request. The key agreement completion callback will be called + * with SILC_KEY_AGREEMENT_ABORTED status. * ***/ void silc_client_abort_key_agreement(SilcClient client, -- 2.43.0