From 651cedc7fbb52e09b6d302919c6b4372486641ed Mon Sep 17 00:00:00 2001 From: Jacob Nevins Date: Sun, 20 Feb 2005 23:00:17 +0000 Subject: [PATCH] On Windows, MessageBoxIndirect() was sometimes failing to pop up the host key 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 | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/windows/windlg.c b/windows/windlg.c index c88e72d7..71125ec8 100644 --- a/windows/windlg.c +++ b/windows/windlg.c @@ -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; } }