diff --git a/src/asm/lexer.c b/src/asm/lexer.c index 678fabd2..287d7d62 100644 --- a/src/asm/lexer.c +++ b/src/asm/lexer.c @@ -800,7 +800,7 @@ static int peekInternal(uint8_t distance) /* forward declarations for peek */ static void shiftChar(void); -static char const *readInterpolation(void); +static char const *readInterpolation(unsigned int depth); static int peek(void) { @@ -845,7 +845,7 @@ restart: } else if (c == '{' && !lexerState->disableInterpolation) { /* If character is an open brace, do symbol interpolation */ shiftChar(); - char const *ptr = readInterpolation(); + char const *ptr = readInterpolation(0); if (ptr) { beginExpansion(ptr, false, ptr); @@ -1258,8 +1258,11 @@ static int readIdentifier(char firstChar) /* 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]; size_t i = 0; struct FormatSpec fmt = fmt_NewSpec(); @@ -1269,7 +1272,7 @@ static char const *readInterpolation(void) if (c == '{') { /* Nested interpolation */ shiftChar(); - char const *ptr = readInterpolation(); + char const *ptr = readInterpolation(depth + 1); if (ptr) { beginExpansion(ptr, false, ptr); @@ -1491,7 +1494,7 @@ static void readString(void) // We'll be exiting the string scope, so re-enable expansions // (Not interpolations, since they're handled by the function itself...) lexerState->disableMacroArgs = false; - char const *ptr = readInterpolation(); + char const *ptr = readInterpolation(0); if (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 // (Not interpolations, since they're handled by the function itself...) lexerState->disableMacroArgs = false; - char const *ptr = readInterpolation(); + char const *ptr = readInterpolation(0); if (ptr) i = appendEscapedSubstring(ptr, i); diff --git a/test/asm/interpolation-recursion.asm b/test/asm/interpolation-recursion.asm new file mode 100644 index 00000000..f522b1e8 --- /dev/null +++ b/test/asm/interpolation-recursion.asm @@ -0,0 +1,6 @@ +recurse EQUS "\{recurse\} " +{recurse} + +; FIXME: also handle the following: +; recurse EQUS "\{recurse\}" +; {recurse} diff --git a/test/asm/interpolation-recursion.err b/test/asm/interpolation-recursion.err new file mode 100644 index 00000000..3597573d --- /dev/null +++ b/test/asm/interpolation-recursion.err @@ -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} " diff --git a/test/asm/interpolation-recursion.out b/test/asm/interpolation-recursion.out new file mode 100644 index 00000000..e69de29b diff --git a/test/asm/nested-interpolation-recursion.asm b/test/asm/nested-interpolation-recursion.asm new file mode 100644 index 00000000..9cbf2a81 --- /dev/null +++ b/test/asm/nested-interpolation-recursion.asm @@ -0,0 +1,3 @@ +def s equs "s" +; 65 nested {}s, recursion limit is 64 +println "{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{s}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}" diff --git a/test/asm/nested-interpolation-recursion.err b/test/asm/nested-interpolation-recursion.err new file mode 100644 index 00000000..aeaa45e7 --- /dev/null +++ b/test/asm/nested-interpolation-recursion.err @@ -0,0 +1,2 @@ +FATAL: nested-interpolation-recursion.asm(3): + Recursion limit (64) exceeded diff --git a/test/asm/nested-interpolation-recursion.out b/test/asm/nested-interpolation-recursion.out new file mode 100644 index 00000000..e69de29b