From: nethack.rankin Date: Sat, 9 Feb 2013 01:33:37 +0000 (+0000) Subject: impossible fix - potentially invalid feedback X-Git-Tag: MOVE2GIT~7 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1183aa680594bdc3975c559a47b3651c09ad610c;p=nethack impossible fix - potentially invalid feedback From a bug report, the message displayed to the screen by impossible() might be different from the one written into paniclog, if it had argument subsitution/formatting. I couldn't reproduce that myself, but stdarg.h/varargs.h is tricky stuff and I think that passing the va_list to a routine which steps through it requires that va_start be called again if you're going to use the va_list a second time. This changes impossible() to handle its arguments only once, like panic(). --- diff --git a/doc/fixes35.0 b/doc/fixes35.0 index cdd75913c..1b15c59fe 100644 --- a/doc/fixes35.0 +++ b/doc/fixes35.0 @@ -847,6 +847,7 @@ when a monster zapped by polymorph drops inventory because of its new form, entering an untended shop while blind gave an inappropriate message engraving feedback about partial text when weapon became too dull to finish was lacking sentence-ending period +impossible() might display inaccurate feedback after updating paniclog Platform- and/or Interface-Specific Fixes diff --git a/src/pline.c b/src/pline.c index 53029c8dc..d4cdb9c43 100644 --- a/src/pline.c +++ b/src/pline.c @@ -302,17 +302,17 @@ raw_printf VA_DECL(const char *, line) /*VARARGS1*/ void impossible VA_DECL(const char *, s) + char pbuf[2*BUFSZ]; VA_START(s); VA_INIT(s, const char *); if (program_state.in_impossible) - panic("impossible called impossible"); + panic("impossible called impossible"); + program_state.in_impossible = 1; - { - char pbuf[BUFSZ]; - Vsprintf(pbuf,s,VA_ARGS); - paniclog("impossible", pbuf); - } - vpline(s,VA_ARGS); + Vsprintf(pbuf, s, VA_ARGS); + pbuf[BUFSZ-1] = '\0'; /* sanity */ + paniclog("impossible", pbuf); + pline("%s", pbuf); pline("Program in disorder - perhaps you'd better #quit."); program_state.in_impossible = 0; VA_END();