mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 18:22:07 +00:00
Fix condition for assuming at EOF
Part of that condition's purpose is to ensure that we read the correct lexer state; but it's possible now for the fstack to be non-empty *before* the lexer state is registered, i.e. if there is an error in the function that registers it. This causes a NULL pointer deref.
This commit is contained in:
@@ -131,6 +131,7 @@ static inline void lexer_SetGfxDigits(char const digits[4]) {
|
|||||||
gfxDigits[3] = digits[3];
|
gfxDigits[3] = digits[3];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool lexer_AtTopLevel();
|
||||||
void lexer_RestartRept(uint32_t lineNo);
|
void lexer_RestartRept(uint32_t lineNo);
|
||||||
void lexer_Init();
|
void lexer_Init();
|
||||||
void lexer_SetMode(LexerMode mode);
|
void lexer_SetMode(LexerMode mode);
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ std::string const &FileStackNode::dump(uint32_t curLineNo) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void fstk_DumpCurrent() {
|
void fstk_DumpCurrent() {
|
||||||
if (contextStack.empty()) {
|
if (lexer_AtTopLevel()) {
|
||||||
fputs("at top level", stderr);
|
fputs("at top level", stderr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -338,6 +338,10 @@ static bool isWhitespace(int c) {
|
|||||||
static LexerState *lexerState = nullptr;
|
static LexerState *lexerState = nullptr;
|
||||||
static LexerState *lexerStateEOL = nullptr;
|
static LexerState *lexerStateEOL = nullptr;
|
||||||
|
|
||||||
|
bool lexer_AtTopLevel() {
|
||||||
|
return lexerState == nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
void LexerState::clear(uint32_t lineNo_) {
|
void LexerState::clear(uint32_t lineNo_) {
|
||||||
mode = LEXER_NORMAL;
|
mode = LEXER_NORMAL;
|
||||||
atLineStart = true; // yylex() will init colNo due to this
|
atLineStart = true; // yylex() will init colNo due to this
|
||||||
|
|||||||
1
test/asm/nonexist-include.asm
Normal file
1
test/asm/nonexist-include.asm
Normal file
@@ -0,0 +1 @@
|
|||||||
|
INCLUDE "nonexist-include.inc"
|
||||||
3
test/asm/nonexist-include.err
Normal file
3
test/asm/nonexist-include.err
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
error: nonexist-include.asm(1):
|
||||||
|
Unable to open included file 'nonexist-include.inc': No such file or directory
|
||||||
|
error: Assembly aborted (1 error)!
|
||||||
4
test/asm/notexist.err
Normal file
4
test/asm/notexist.err
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
error: at top level:
|
||||||
|
Failed to stat file "notexist.asm": No such file or directory
|
||||||
|
FATAL: at top level:
|
||||||
|
Failed to open main file
|
||||||
@@ -60,13 +60,13 @@ else
|
|||||||
rm -f version.asm
|
rm -f version.asm
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for i in *.asm; do
|
for i in *.asm notexist.asm; do
|
||||||
flags=${i%.asm}.flags
|
flags=${i%.asm}.flags
|
||||||
RGBASMFLAGS=-Weverything
|
RGBASMFLAGS=-Weverything
|
||||||
if [ -f "$flags" ]; then
|
if [ -f "$flags" ]; then
|
||||||
RGBASMFLAGS="$(head -n 1 "$flags")" # Allow other lines to serve as comments
|
RGBASMFLAGS="$(head -n 1 "$flags")" # Allow other lines to serve as comments
|
||||||
fi
|
fi
|
||||||
for variant in '' '.pipe'; do
|
for variant in '' ' piped'; do
|
||||||
(( tests++ ))
|
(( tests++ ))
|
||||||
echo "${bold}${green}${i%.asm}${variant}...${rescolors}${resbold}"
|
echo "${bold}${green}${i%.asm}${variant}...${rescolors}${resbold}"
|
||||||
if [ -e "${i%.asm}.out" ]; then
|
if [ -e "${i%.asm}.out" ]; then
|
||||||
@@ -85,8 +85,9 @@ for i in *.asm; do
|
|||||||
desired_errput=$desired_errname
|
desired_errput=$desired_errname
|
||||||
else
|
else
|
||||||
# `include-recursion.asm` refers to its own name inside the test code.
|
# `include-recursion.asm` refers to its own name inside the test code.
|
||||||
# Skip testing with stdin input for that file.
|
# "notexist" doesn't exist, so there's no point in trying to `cat` it.
|
||||||
if [ "$i" = "include-recursion.asm" ]; then
|
# Skip testing with stdin input for those file.
|
||||||
|
if [[ "$i" = include-recursion.asm || "$i" = notexist.asm ]]; then
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user