prevent infinite recursion in impossible

This commit is contained in:
nethack.allison
2003-12-05 12:30:18 +00:00
parent 4d7a39e563
commit 40f3251cf4
4 changed files with 19 additions and 6 deletions

View 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

View 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;

View 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;

View 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();
}