From 8ad07bf7fa3f4a579935e59c8832315e19d75908 Mon Sep 17 00:00:00 2001 From: Skywing Date: Sat, 28 Jun 2008 00:21:51 -0500 Subject: [PATCH] Add reference counting to SilcClientEntry/SilcServerEntry for getkey response. This is necessary in case the entry goes away before the user responds to the keyboard input request. (Fix for getkey crash if a user logs off before one responds to the getkey prompt.) --- apps/irssi/src/silc/core/client_ops.c | 28 +++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/apps/irssi/src/silc/core/client_ops.c b/apps/irssi/src/silc/core/client_ops.c index c42a2aa9..e773009f 100644 --- a/apps/irssi/src/silc/core/client_ops.c +++ b/apps/irssi/src/silc/core/client_ops.c @@ -1438,6 +1438,21 @@ void silc_getkey_cb(bool success, void *context) entity, name); } + /* + * XXX: What if the connection or client went away? They're not even + * refcounted and we don't have a way to cancel the input callback. Bad! + */ + switch (getkey->id_type) + { + case SILC_ID_CLIENT: + silc_client_unref_client(getkey->client, getkey->conn, (SilcClientEntry)getkey->entry); + break; + + case SILC_ID_SERVER: + silc_client_unref_server(getkey->client, getkey->conn, (SilcServerEntry)getkey->entry); + break; + } + silc_free(getkey); } @@ -2097,6 +2112,19 @@ void silc_command_reply(SilcClient client, SilcClientConnection conn, ((SilcClientEntry)entry)->nickname : ((SilcServerEntry)entry)->server_name); + switch (id_type) + { + case SILC_ID_CLIENT: + name = ((SilcClientEntry)entry)->nickname; + silc_client_ref_client(client, conn, (SilcClientEntry)entry); + break; + + case SILC_ID_SERVER: + name = ((SilcServerEntry)entry)->server_name; + silc_client_ref_server(client, conn, (SilcServerEntry)entry); + break; + } + silc_verify_public_key_internal(client, conn, name, (id_type == SILC_ID_CLIENT ? SILC_CONN_CLIENT : -- 2.24.0