diff --git a/tccrun.c b/tccrun.c index b07ab0f4..55fb3d81 100644 --- a/tccrun.c +++ b/tccrun.c @@ -110,13 +110,30 @@ LIBTCCAPI int tcc_run(TCCState *s1, int argc, char **argv) if (s1->do_bounds_check) { void (*bound_init)(void); void (*bound_exit)(void); + void (*bound_new_region)(void *p, unsigned long size); + int (*bound_delete_region)(void *p); + int i; + /* set error function */ rt_bound_error_msg = tcc_get_symbol_err(s1, "__bound_error_msg"); /* XXX: use .init section so that it also work in binary ? */ bound_init = tcc_get_symbol_err(s1, "__bound_init"); bound_exit = tcc_get_symbol_err(s1, "__bound_exit"); + bound_new_region = tcc_get_symbol_err(s1, "__bound_new_region"); + bound_delete_region = tcc_get_symbol_err(s1, "__bound_delete_region"); bound_init(); + /* mark argv area as valid */ + bound_new_region(argv, argc*sizeof(argv[0])); + for (i=0; i<argc; ++i) + bound_new_region(argv[i], strlen(argv[i])); + ret = (*prog_main)(argc, argv); + + /* unmark argv area */ + for (i=0; i<argc; ++i) + bound_delete_region(argv[i]); + bound_delete_region(argv); + bound_exit(); } else #endif