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
|
attempting to drop a subset of a stack of multiple cursed loadstones could
|
||||||
corrupt inventory or cause a crash
|
corrupt inventory or cause a crash
|
||||||
"miss" message was missing for thrown or kicked gold not caught by a monster
|
"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
|
Platform- and/or Interface-Specific Fixes
|
||||||
|
|||||||
@@ -152,6 +152,10 @@ E NEARDATA struct sinfo {
|
|||||||
int panicking; /* `panic' is in progress */
|
int panicking; /* `panic' is in progress */
|
||||||
#if defined(VMS) || defined(WIN32)
|
#if defined(VMS) || defined(WIN32)
|
||||||
int exiting; /* an exit handler is executing */
|
int exiting; /* an exit handler is executing */
|
||||||
|
#endif
|
||||||
|
int in_impossible;
|
||||||
|
#ifdef PANICLOG
|
||||||
|
int in_paniclog;
|
||||||
#endif
|
#endif
|
||||||
} program_state;
|
} program_state;
|
||||||
|
|
||||||
|
|||||||
+10
-6
@@ -2275,12 +2275,16 @@ const char *reason; /* explanation */
|
|||||||
FILE *lfile;
|
FILE *lfile;
|
||||||
char buf[BUFSZ];
|
char buf[BUFSZ];
|
||||||
|
|
||||||
lfile = fopen_datafile(PANICLOG, "a", TROUBLEPREFIX);
|
if (!program_state.in_paniclog) {
|
||||||
if (lfile) {
|
program_state.in_paniclog = 1;
|
||||||
(void) fprintf(lfile, "%s %08ld: %s %s\n",
|
lfile = fopen_datafile(PANICLOG, "a", TROUBLEPREFIX);
|
||||||
version_string(buf), yyyymmdd((time_t)0L),
|
if (lfile) {
|
||||||
type, reason);
|
(void) fprintf(lfile, "%s %08ld: %s %s\n",
|
||||||
(void) fclose(lfile);
|
version_string(buf), yyyymmdd((time_t)0L),
|
||||||
|
type, reason);
|
||||||
|
(void) fclose(lfile);
|
||||||
|
}
|
||||||
|
program_state.in_paniclog = 0;
|
||||||
}
|
}
|
||||||
#endif /* PANICLOG */
|
#endif /* PANICLOG */
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -252,6 +252,9 @@ void
|
|||||||
impossible VA_DECL(const char *, s)
|
impossible VA_DECL(const char *, s)
|
||||||
VA_START(s);
|
VA_START(s);
|
||||||
VA_INIT(s, const char *);
|
VA_INIT(s, const char *);
|
||||||
|
if (program_state.in_impossible)
|
||||||
|
panic("impossible called impossible");
|
||||||
|
program_state.in_impossible = 1;
|
||||||
{
|
{
|
||||||
char pbuf[BUFSZ];
|
char pbuf[BUFSZ];
|
||||||
Vsprintf(pbuf,s,VA_ARGS);
|
Vsprintf(pbuf,s,VA_ARGS);
|
||||||
@@ -259,6 +262,7 @@ impossible VA_DECL(const char *, s)
|
|||||||
}
|
}
|
||||||
vpline(s,VA_ARGS);
|
vpline(s,VA_ARGS);
|
||||||
pline("Program in disorder - perhaps you'd better #quit.");
|
pline("Program in disorder - perhaps you'd better #quit.");
|
||||||
|
program_state.in_impossible = 0;
|
||||||
VA_END();
|
VA_END();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user