Fix crash on expired keyboard prompts
[silc.git] / apps / irssi / src / silc / core / silc-servers.c
index ba0dc80ae19d214a45c2978649ea2d83d62e5975..e763b8eef2f9c6792738b275458709ab38de4224 100644 (file)
@@ -102,9 +102,14 @@ static void silc_send_msg_clients(SilcClient client,
   clients = silc_client_get_clients_local(silc_client, server->conn,
                                          rec->nick, FALSE);
   if (!clients) {
-    printtext(NULL, NULL, MSGLEVEL_CLIENTERROR,
-             "%s: There is no such client (did you mean %s?)", rec->nick,
-             target->nickname);
+    if (strchr(rec->nick, '@') && target->server)
+      printtext(NULL, NULL, MSGLEVEL_CLIENTERROR,
+               "%s: There is no such client (did you mean %s@%s?)", rec->nick,
+               target->nickname, target->server);
+    else
+      printtext(NULL, NULL, MSGLEVEL_CLIENTERROR,
+               "%s: There is no such client (did you mean %s?)", rec->nick,
+               target->nickname);
     goto out;
   }
 
@@ -421,6 +426,22 @@ static void sig_connected_stream_created(SilcSocketStreamStatus status,
                        SILCTXT_REATTACH, server->tag);
   silc_free(file);
 
+  /*
+       * Store the SILC_SERVER_REC in the stream context so that we can fetch it
+       * from the verify key exchange prompt.  There should have been an initial
+       * user parameter value for the SilcClientConnection that could have been
+       * passed to SilcClientConnectionParams, but because there's no version
+       * number or size field in SilcClientConnectionParams, it is fixed for all
+       * time and not extendable.
+       *
+       * Instead, we must revert to pulling the SilcStream out of the
+       * SilcPacketStream associated with the SilcClientConnection object in the
+       * verify key exchange prompt callback in order to get our per-connection
+       * context.  Hence, the extra levels of indirection.
+       */
+
+  silc_socket_stream_set_context(stream, server);
+
   /* Start key exchange */
   server->op = silc_client_key_exchange(silc_client, &params,
                                        irssi_pubkey, irssi_privkey,
@@ -461,6 +482,12 @@ static void sig_disconnected(SILC_SERVER_REC *server)
   if (!IS_SILC_SERVER(server))
     return;
 
+  /* If we have a prompt in progress, then abort it. */
+  if (server->prompt_op) {
+    silc_async_abort(server->prompt_op, NULL, NULL);
+        server->prompt_op = NULL;
+  }
+
   if (server->conn) {
     /* Close connection */
     silc_client_close_connection(silc_client, server->conn);