From: PatR Date: Sat, 14 May 2016 09:13:07 +0000 (-0700) Subject: different fix for #H4332 - Qt crashes upon quit X-Git-Tag: NetHack-3.6.1_RC01~772 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0bd13a7a8c7e6ec702ff79f4c0bcd7aedde1a902;p=nethack different fix for #H4332 - Qt crashes upon quit Quiting without ever examining inventory caused the Qt interface to issue an impossible(), then crash due to deferencing a Null pointer. The prior fix was to suppress the validation code that was crashing. This changes things so that the inventory window always gets at least one use, allowing the Qt validation code to succeed. tty and X11 are ok with it; win32 needs to be verified. --- diff --git a/src/allmain.c b/src/allmain.c index 4aef642c5..7d7ff03c6 100644 --- a/src/allmain.c +++ b/src/allmain.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 allmain.c $NHDT-Date: 1451955079 2016/01/05 00:51:19 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.70 $ */ +/* NetHack 3.6 allmain.c $NHDT-Date: 1463217182 2016/05/14 09:13:02 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.72 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -506,6 +506,9 @@ display_gamewindows() #endif WIN_MAP = create_nhwindow(NHW_MAP); WIN_INVEN = create_nhwindow(NHW_MENU); + /* in case of early quit where WIN_INVEN could be destroyed before + ever having been used, use it here to pacify the Qt interface */ + start_menu(WIN_INVEN), end_menu(WIN_INVEN, (char *) 0); #ifdef MAC /* This _is_ the right place for this - maybe we will diff --git a/win/Qt/qt_win.cpp b/win/Qt/qt_win.cpp index 8350c8ca9..db995f7ea 100644 --- a/win/Qt/qt_win.cpp +++ b/win/Qt/qt_win.cpp @@ -4401,12 +4401,11 @@ void NetHackQtMenuOrTextWindow::Display(bool block) bool NetHackQtMenuOrTextWindow::Destroy() { - bool res; + bool res = FALSE; - if (!actual) { - /* impossible("Destroy called before we know if Menu or Text"); */ - res = FALSE; // early Destroy is not impossible - } else + if (!actual) + impossible("Destroy called before we know if Menu or Text"); + else res = actual->Destroy(); return res;