prevent infinite recursion in impossible
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
16
src/files.c
16
src/files.c
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user