]> asedeno.scripts.mit.edu Git - PuTTY.git/commitdiff
On Windows, MessageBoxIndirect() was sometimes failing to pop up the host key
authorJacob Nevins <jacobn@chiark.greenend.org.uk>
Sun, 20 Feb 2005 23:00:17 +0000 (23:00 +0000)
committerJacob Nevins <jacobn@chiark.greenend.org.uk>
Sun, 20 Feb 2005 23:00:17 +0000 (23:00 +0000)
dialog and returning an unexpected value (0), causing everything to silently
behave as if the user had said "allow this connection but don't store host
key"!

Initialising (MSGBOXPARAMS).hInstance seems to have cured this (although the
MSDN docs seemed to indicate it wouldn't be used) -- if so, it's been broken
since r5309 on 2004-02-15 -- but since this was something of a Heisenbug, and
the behaviour was so catastrophic when MessageBoxIndirect() behaved oddly, I've
rearranged the code to default to cancelling, and added an assertion for
visibility.

(Windows PuTTY still seems to be broken wrt servers that send NEWKEYS while
we're waiting for the user, which happens to include the "SSH-2.0-2.4.1 SSH
Secure Shell OpenVMS V1.0" I'm testing against. I don't know why. The above bug
may also have been limited to this circumstance.)

[originally from svn r5370]
[r5309 == 99122767f528fa86e6e33c1bc594af2c0dcb884b]

windows/windlg.c

index c88e72d704ea13d852ff400e2a34fd0dbc283ebe..71125ec89e3abb2f3a9aa3a5649c0a2fb931b0fe 100644 (file)
@@ -769,6 +769,7 @@ int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype,
      * callback function for the Help button.
      */
     mbox.cbSize = sizeof(mbox);
+    mbox.hInstance = hinst;
     mbox.hwndOwner = hwnd;
     mbox.lpfnMsgBoxCallback = &verify_ssh_host_key_help;
     mbox.dwLanguageId = LANG_NEUTRAL;
@@ -793,13 +794,14 @@ int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype,
        mbox.dwStyle = MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON3 |
            help_button;
        mbret = MessageBoxIndirect(&mbox);
+       assert(mbret==IDYES || mbret==IDNO || mbret==IDCANCEL);
        sfree((void *)mbox.lpszText);
        sfree((void *)mbox.lpszCaption);
        if (mbret == IDYES)
            store_host_key(host, port, keytype, keystr);
-       if (mbret == IDCANCEL)
-           return 0;
-        return 1;
+       if (mbret == IDNO)
+           return 1;
+        return 0;
     }
     if (ret == 1) {                   /* key was absent */
        int mbret;
@@ -809,13 +811,14 @@ int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype,
        mbox.dwStyle = MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON3 |
            help_button;
        mbret = MessageBoxIndirect(&mbox);
+       assert(mbret==IDYES || mbret==IDNO || mbret==IDCANCEL);
        sfree((void *)mbox.lpszText);
        sfree((void *)mbox.lpszCaption);
        if (mbret == IDYES)
            store_host_key(host, port, keytype, keystr);
-       if (mbret == IDCANCEL)
-           return 0;
-        return 1;
+       if (mbret == IDNO)
+           return 1;
+        return 0;
     }
 }