diff options
| author | Michael Matz <matz@suse.de> | 2016-08-15 05:09:31 +0200 |
|---|---|---|
| committer | Michael Matz <matz@suse.de> | 2016-12-15 17:47:10 +0100 |
| commit | be6d8ffc107db78d0542b5ee2d3306e7e132725c (patch) | |
| tree | fd76a1e61b710ed0cec5b5d800a3be4868be9b72 /tcc.h | |
| parent | d0d25ec7df636deaf650d31ae3b50e60659f54dd (diff) | |
| download | tinycc-be6d8ffc107db78d0542b5ee2d3306e7e132725c.tar.gz tinycc-be6d8ffc107db78d0542b5ee2d3306e7e132725c.tar.bz2 | |
Fix access-after-free with statement expressions
The return value of statement expressions might refer to local
symbols, so those can't be popped. The old error message always
was just a band-aid, and since disabling it for pointer types it
wasn't effective anyway. It also never considered that also the
vtop->sym member might have referred to such symbols (see the
testcase with the local static, that used to segfault).
For fixing this (can be seen better with valgrind and SYM_DEBUG)
simply leave local symbols of stmt exprs on the stack.
Diffstat (limited to 'tcc.h')
| -rw-r--r-- | tcc.h | 2 |
1 files changed, 1 insertions, 1 deletions
@@ -1099,7 +1099,7 @@ ST_INLN void sym_free(Sym *sym); ST_FUNC Sym *sym_push2(Sym **ps, int v, int t, long c); ST_FUNC Sym *sym_find2(Sym *s, int v); ST_FUNC Sym *sym_push(int v, CType *type, int r, int c); -ST_FUNC void sym_pop(Sym **ptop, Sym *b); +ST_FUNC void sym_pop(Sym **ptop, Sym *b, int keep); ST_INLN Sym *struct_find(int v); ST_INLN Sym *sym_find(int v); ST_FUNC Sym *global_identifier_push(int v, int t, int c); |
