readInterpolation is limited by nMaxRecursionDepth

Fixes #837
This commit is contained in:
Rangi
2021-04-16 16:10:46 -04:00
parent d2f6def2eb
commit e78a1d5bfd
7 changed files with 87 additions and 6 deletions

View File

@@ -800,7 +800,7 @@ static int peekInternal(uint8_t distance)
/* forward declarations for peek */ /* forward declarations for peek */
static void shiftChar(void); static void shiftChar(void);
static char const *readInterpolation(void); static char const *readInterpolation(unsigned int depth);
static int peek(void) static int peek(void)
{ {
@@ -845,7 +845,7 @@ restart:
} else if (c == '{' && !lexerState->disableInterpolation) { } else if (c == '{' && !lexerState->disableInterpolation) {
/* If character is an open brace, do symbol interpolation */ /* If character is an open brace, do symbol interpolation */
shiftChar(); shiftChar();
char const *ptr = readInterpolation(); char const *ptr = readInterpolation(0);
if (ptr) { if (ptr) {
beginExpansion(ptr, false, ptr); beginExpansion(ptr, false, ptr);
@@ -1258,8 +1258,11 @@ static int readIdentifier(char firstChar)
/* Functions to read strings */ /* Functions to read strings */
static char const *readInterpolation(void) static char const *readInterpolation(unsigned int depth)
{ {
if (depth >= nMaxRecursionDepth)
fatalerror("Recursion limit (%zu) exceeded\n", nMaxRecursionDepth);
char symName[MAXSYMLEN + 1]; char symName[MAXSYMLEN + 1];
size_t i = 0; size_t i = 0;
struct FormatSpec fmt = fmt_NewSpec(); struct FormatSpec fmt = fmt_NewSpec();
@@ -1269,7 +1272,7 @@ static char const *readInterpolation(void)
if (c == '{') { /* Nested interpolation */ if (c == '{') { /* Nested interpolation */
shiftChar(); shiftChar();
char const *ptr = readInterpolation(); char const *ptr = readInterpolation(depth + 1);
if (ptr) { if (ptr) {
beginExpansion(ptr, false, ptr); beginExpansion(ptr, false, ptr);
@@ -1491,7 +1494,7 @@ static void readString(void)
// We'll be exiting the string scope, so re-enable expansions // We'll be exiting the string scope, so re-enable expansions
// (Not interpolations, since they're handled by the function itself...) // (Not interpolations, since they're handled by the function itself...)
lexerState->disableMacroArgs = false; lexerState->disableMacroArgs = false;
char const *ptr = readInterpolation(); char const *ptr = readInterpolation(0);
if (ptr) if (ptr)
while (*ptr) while (*ptr)
@@ -1641,7 +1644,7 @@ static size_t appendStringLiteral(size_t i)
// We'll be exiting the string scope, so re-enable expansions // We'll be exiting the string scope, so re-enable expansions
// (Not interpolations, since they're handled by the function itself...) // (Not interpolations, since they're handled by the function itself...)
lexerState->disableMacroArgs = false; lexerState->disableMacroArgs = false;
char const *ptr = readInterpolation(); char const *ptr = readInterpolation(0);
if (ptr) if (ptr)
i = appendEscapedSubstring(ptr, i); i = appendEscapedSubstring(ptr, i);

View File

@@ -0,0 +1,6 @@
recurse EQUS "\{recurse\} "
{recurse}
; FIXME: also handle the following:
; recurse EQUS "\{recurse\}"
; {recurse}

View File

@@ -0,0 +1,67 @@
FATAL: interpolation-recursion.asm(2):
Recursion limit (64) exceeded
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "
while expanding symbol "{recurse} "

View File

View File

@@ -0,0 +1,3 @@
def s equs "s"
; 65 nested {}s, recursion limit is 64
println "{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{s}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}"

View File

@@ -0,0 +1,2 @@
FATAL: nested-interpolation-recursion.asm(3):
Recursion limit (64) exceeded