Skip to content

Commit f95c7e9

Browse files
igormunkincyrillos
authored andcommitted
preproc: prohibit unmacro while macro expansion
If macro is undefined while it's being expanded, use after free occurs, since the MMacro instance is released, but it is still used to proceed the expansion. This change forbids macro undefinition: non-fatal error is raised and the MMacro instance is not released if it is being processed by NASM preprocessor. Consider the following example: | $ cat test.asm | %macro m 0 | %unmacro m 0 | %endmacro | m | $ ./nasm test.asm | test.asm:4: error: `%unmacro' can't undefine the macro being expanded | test.asm:2: ... from macro `m' defined here Fixes BR3392531 and BR3392716. Signed-off-by: Igor Munkin <imun@cpan.org> Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
1 parent e7c2f0e commit f95c7e9

File tree

7 files changed

+104
-0
lines changed

7 files changed

+104
-0
lines changed

asm/preproc.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4225,6 +4225,19 @@ static int do_directive(Token *tline, Token **output)
42254225
goto done;
42264226
}
42274227
mmac_p = (MMacro **) hash_findi(&mmacros, spec.name, NULL);
4228+
4229+
/* Check the macro to be undefined is not being expanded */
4230+
list_for_each(l, istk->expansion) {
4231+
if (l->finishes == *mmac_p) {
4232+
nasm_nonfatal("`%%unmacro' can't undefine the macro being expanded");
4233+
/*
4234+
* Do not release the macro instance to avoid using the freed
4235+
* memory while proceeding the expansion.
4236+
*/
4237+
goto done;
4238+
}
4239+
}
4240+
42284241
while (mmac_p && *mmac_p) {
42294242
mmac = *mmac_p;
42304243
if (mmac->casesense == spec.casesense &&

travis/test/br3392531.asm

366 Bytes
Binary file not shown.

travis/test/br3392531.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[
2+
{
3+
"description": "%unmacro is forbidden for macro being expanded",
4+
"id": "br3392531",
5+
"format": "bin",
6+
"source": "br3392531.asm",
7+
"error": "expected",
8+
"target": [
9+
{ "stderr": "br3392531.stderr" }
10+
]
11+
}
12+
]

travis/test/br3392531.stderr

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
./travis/test/br3392531.asm:1: error: label or instruction expected at start of line
2+
./travis/test/br3392531.asm:4: error: invalid decorator token inside braces
3+
./travis/test/br3392531.asm:4: error: label or instruction expected at start of line
4+
./travis/test/br3392531.asm:5: error: parser: instruction expected
5+
./travis/test/br3392531.asm:7: error: `%macro' expects a parameter count
6+
./travis/test/br3392531.asm:11: warning: unterminated string [-w+other]
7+
./travis/test/br3392531.asm:14: error: parser: instruction expected
8+
./travis/test/br3392531.asm:17: error: `%$LRG': context stack is empty
9+
./travis/test/br3392531.asm:17: error: `%$LRG': context stack is empty
10+
./travis/test/br3392531.asm:17: error: label or instruction expected at start of line
11+
./travis/test/br3392531.asm:18: error: label or instruction expected at start of line
12+
./travis/test/br3392531.asm:19: error: parser: instruction expected
13+
./travis/test/br3392531.asm:20: error: `%1': not in a macro call
14+
./travis/test/br3392531.asm:20: error: label or instruction expected at start of line
15+
./travis/test/br3392531.asm:21: error: label or instruction expected at start of line
16+
./travis/test/br3392531.asm:8: ... from macro `section' defined here
17+
./travis/test/br3392531.asm:21: error: parser: instruction expected
18+
./travis/test/br3392531.asm:9: ... from macro `section' defined here
19+
./travis/test/br3392531.asm:21: error: label or instruction expected at start of line
20+
./travis/test/br3392531.asm:10: ... from macro `section' defined here
21+
./travis/test/br3392531.asm:21: error: invalid macro parameter: `%4stru@namB'
22+
./travis/test/br3392531.asm:11: ... from macro `section' defined here
23+
./travis/test/br3392531.asm:21: error: parser: instruction expected
24+
./travis/test/br3392531.asm:11: ... from macro `section' defined here
25+
./travis/test/br3392531.asm:21: error: `%unmacro' expects a parameter count
26+
./travis/test/br3392531.asm:12: ... from macro `section' defined here
27+
./travis/test/br3392531.asm:21: error: `%unmacro' can't undefine the macro being expanded
28+
./travis/test/br3392531.asm:12: ... from macro `section' defined here
29+
./travis/test/br3392531.asm:22: error: parser: instruction expected

travis/test/br3392716.asm

237 Bytes
Binary file not shown.

travis/test/br3392716.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
[
2+
{
3+
"description": "%unmacro is forbidden for macro being expanded",
4+
"id": "br3392716",
5+
"format": "macho64",
6+
"source": "br3392716.asm",
7+
"option": "-g",
8+
"error": "expected",
9+
"target": [
10+
{ "stderr": "br3392716.stderr" }
11+
]
12+
}
13+
]

travis/test/br3392716.stderr

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
./travis/test/br3392716.asm:1: error: label or instruction expected at start of line
2+
./travis/test/br3392716.asm:2: error: `%unmacro' expects a parameter count
3+
./travis/test/br3392716.asm:3: warning: unterminated string [-w+other]
4+
./travis/test/br3392716.asm:3: error: `%unmacro' expects a macro name
5+
./travis/test/br3392716.asm:4: warning: unterminated string [-w+other]
6+
./travis/test/br3392716.asm:4: error: label or instruction expected at start of line
7+
./travis/test/br3392716.asm:5: error: `%macro' expects a parameter count
8+
./travis/test/br3392716.asm:15: warning: unterminated string [-w+other]
9+
./travis/test/br3392716.asm:20: warning: unterminated string [-w+other]
10+
./travis/test/br3392716.asm:20: warning: multi-line macro `sst' exists, but not taking 1 parameter [-w+macro-params-multi]
11+
./travis/test/br3392716.asm:20: error: parser: instruction expected
12+
./travis/test/br3392716.asm:21: error: `%%cTo': not in a macro call
13+
./travis/test/br3392716.asm:21: error: label or instruction expected at start of line
14+
./travis/test/br3392716.asm:6: ... from macro `sst' defined here
15+
./travis/test/br3392716.asm:21: error: `%unmacro' expects a parameter count
16+
./travis/test/br3392716.asm:7: ... from macro `sst' defined here
17+
./travis/test/br3392716.asm:21: error: `%unmacro' can't undefine the macro being expanded
18+
./travis/test/br3392716.asm:7: ... from macro `sst' defined here
19+
./travis/test/br3392716.asm:21: error: label or instruction expected at start of line
20+
./travis/test/br3392716.asm:8: ... from macro `sst' defined here
21+
./travis/test/br3392716.asm:21: error: parser: instruction expected
22+
./travis/test/br3392716.asm:10: ... from macro `sst' defined here
23+
./travis/test/br3392716.asm:21: error: label or instruction expected at start of line
24+
./travis/test/br3392716.asm:11: ... from macro `sst' defined here
25+
./travis/test/br3392716.asm:21: error: `%unmacro' expects a parameter count
26+
./travis/test/br3392716.asm:12: ... from macro `sst' defined here
27+
./travis/test/br3392716.asm:21: error: `%unmacro' can't undefine the macro being expanded
28+
./travis/test/br3392716.asm:12: ... from macro `sst' defined here
29+
./travis/test/br3392716.asm:21: error: label or instruction expected at start of line
30+
./travis/test/br3392716.asm:13: ... from macro `sst' defined here
31+
./travis/test/br3392716.asm:21: error: parser: instruction expected
32+
./travis/test/br3392716.asm:15: ... from macro `sst' defined here
33+
./travis/test/br3392716.asm:21: error: `%macro' expects a macro name
34+
./travis/test/br3392716.asm:16: ... from macro `sst' defined here
35+
./travis/test/br3392716.asm:21: error: parser: instruction expected
36+
./travis/test/br3392716.asm:17: ... from macro `sst' defined here
37+
./travis/test/br3392716.asm:22: error: label or instruction expected at start of line

0 commit comments

Comments
 (0)