mirror of
https://github.com/frida/tinycc
synced 2024-11-24 08:39:37 +03:00
Create bcheck region for argv and arge argument
For program manipulating argv or arge as pointer with construct such as: (while *argv++) { do_something_with_argv; } it is necessary to have argv and arge inside a region. This patch create regions argv and arge) if main is declared with those parameters.
This commit is contained in:
parent
9a6ee577f6
commit
b125743323
@ -418,6 +418,13 @@ void __bound_init(void)
|
||||
}
|
||||
}
|
||||
|
||||
void __bound_main_arg(void **p)
|
||||
{
|
||||
void *start = p;
|
||||
while (*p++);
|
||||
__bound_new_region(start, (void *) p - start);
|
||||
}
|
||||
|
||||
void __bound_exit(void)
|
||||
{
|
||||
restore_malloc_hooks();
|
||||
|
15
tccgen.c
15
tccgen.c
@ -5770,6 +5770,21 @@ static void gen_function(Sym *sym)
|
||||
/* push a dummy symbol to enable local sym storage */
|
||||
sym_push2(&local_stack, SYM_FIELD, 0, 0);
|
||||
gfunc_prolog(&sym->type);
|
||||
#ifdef CONFIG_TCC_BCHECK
|
||||
if (tcc_state->do_bound_check
|
||||
&& !strcmp(get_tok_str(sym->v, NULL), "main")) {
|
||||
int i;
|
||||
|
||||
sym = local_stack;
|
||||
for (i = 0, sym = local_stack; i < 2; i++, sym = sym->prev) {
|
||||
if (sym->v & SYM_FIELD || sym->prev->v & SYM_FIELD)
|
||||
break;
|
||||
vpush_global_sym(&func_old_type, TOK___bound_main_arg);
|
||||
vset(&sym->type, sym->r, sym->c);
|
||||
gfunc_call(1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
rsym = 0;
|
||||
block(NULL, NULL, NULL, NULL, 0, 0);
|
||||
gsym(rsym);
|
||||
|
1
tcctok.h
1
tcctok.h
@ -237,6 +237,7 @@
|
||||
DEF(TOK___bound_ptr_indir8, "__bound_ptr_indir8")
|
||||
DEF(TOK___bound_ptr_indir12, "__bound_ptr_indir12")
|
||||
DEF(TOK___bound_ptr_indir16, "__bound_ptr_indir16")
|
||||
DEF(TOK___bound_main_arg, "__bound_main_arg")
|
||||
DEF(TOK___bound_local_new, "__bound_local_new")
|
||||
DEF(TOK___bound_local_delete, "__bound_local_delete")
|
||||
# ifdef TCC_TARGET_PE
|
||||
|
Loading…
Reference in New Issue
Block a user