Add reference counting to SilcClientEntry/SilcServerEntry for getkey response.
authorSkywing <skywing@valhallalegends.com>
Sat, 28 Jun 2008 05:21:51 +0000 (00:21 -0500)
committerKp <kp@valhallalegends.com>
Sat, 8 Nov 2008 23:03:56 +0000 (18:03 -0500)
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

index c42a2aa9779bc9c695786a345c85b205e336a6a4..e773009f358d54d0cf4d5a0d0e1e9e5dcdf3c1ec 100644 (file)
@@ -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 :