]> granicus.if.org Git - nethack/commitdiff
prevent infinite recursion in impossible
authornethack.allison <nethack.allison>
Fri, 5 Dec 2003 12:30:18 +0000 (12:30 +0000)
committernethack.allison <nethack.allison>
Fri, 5 Dec 2003 12:30:18 +0000 (12:30 +0000)
doc/fixes34.3
include/decl.h
src/files.c
src/pline.c

index 1ff7d824164ac45e478d697b0b9145f8ce3a7f91..519b47695a17c7319f93be3e1d223ef32fdf7947 100644 (file)
@@ -100,6 +100,7 @@ prevent "see it drop from your pack" when figurine monster becomes undetected
 attempting to drop a subset of a stack of multiple cursed loadstones could
        corrupt inventory or cause a crash
 "miss" message was missing for thrown or kicked gold not caught by a monster
+prevent recursive impossible() and panic() calls from leading to a stack overflow
 
 
 Platform- and/or Interface-Specific Fixes
index 734e8ec025897c956f67b86c32d9598f86b37a1e..dac11660e1a3bdc89fef4cd13dedb759047a6668 100644 (file)
@@ -152,6 +152,10 @@ E NEARDATA struct sinfo {
        int panicking;          /* `panic' is in progress */
 #if defined(VMS) || defined(WIN32)
        int exiting;            /* an exit handler is executing */
+#endif
+       int in_impossible;
+#ifdef PANICLOG
+       int in_paniclog;
 #endif
 } program_state;
 
index 1cca1ca06baf105cc7b77f3d23ef60283a2b79b7..d2e3086dc43e74ace72f634e55073e0ac902beb5 100644 (file)
@@ -2275,12 +2275,16 @@ const char *reason;     /* explanation */
        FILE *lfile;
        char buf[BUFSZ];
 
-       lfile = fopen_datafile(PANICLOG, "a", TROUBLEPREFIX);
-       if (lfile) {
-           (void) fprintf(lfile, "%s %08ld: %s %s\n",
-                          version_string(buf), yyyymmdd((time_t)0L),
-                          type, reason);
-           (void) fclose(lfile);
+       if (!program_state.in_paniclog) {
+               program_state.in_paniclog = 1;
+               lfile = fopen_datafile(PANICLOG, "a", TROUBLEPREFIX);
+               if (lfile) {
+                   (void) fprintf(lfile, "%s %08ld: %s %s\n",
+                                  version_string(buf), yyyymmdd((time_t)0L),
+                                  type, reason);
+                   (void) fclose(lfile);
+               }
+               program_state.in_paniclog = 0;
        }
 #endif /* PANICLOG */
        return;
index 2febc95f058ddf3b7852e00b624786f0717179ed..60218fe15a49f6af5d8cd0bc54f700e3f2a4e333 100644 (file)
@@ -252,6 +252,9 @@ void
 impossible VA_DECL(const char *, s)
        VA_START(s);
        VA_INIT(s, const char *);
+       if (program_state.in_impossible)
+               panic("impossible called impossible");
+       program_state.in_impossible = 1;
        {
            char pbuf[BUFSZ];
            Vsprintf(pbuf,s,VA_ARGS);
@@ -259,6 +262,7 @@ impossible VA_DECL(const char *, s)
        }
        vpline(s,VA_ARGS);
        pline("Program in disorder - perhaps you'd better #quit.");
+       program_state.in_impossible = 0;
        VA_END();
 }