diff options
Diffstat (limited to 'src/prog.c')
-rw-r--r-- | src/prog.c | 21 |
1 files changed, 14 insertions, 7 deletions
@@ -385,5 +385,5 @@ env_get_locus(eval_environ_t env, struct mu_locus_range *locus) mu_locus_range_init(locus); locus->beg.mu_file = (char*)(env->dataseg + env->locus.file); - env_register_auto(env, (void*) locus->beg.mu_file); + env_register_auto(env, (void*) &locus->beg.mu_file); locus->beg.mu_line = env->locus.line; #if 0 @@ -494,12 +494,18 @@ static void env_register_auto(eval_environ_t env, void *ptr) { + char *addr = *(char**)ptr; + if (env->numautos == MAX_AUTO_PTR) runtime_error(env, "INTERNAL ERROR at %s:%d, please report", __FILE__, __LINE__); + /* Check if address is within the dataseg */ + if (!(addr >= (char*) env->dataseg + && (addr < (char*) (env->dataseg + datasize + env->stack_size)))) + ptr = NULL; env->auto_ptr[env->numautos++] = ptr; } /* Pop the last registered auto variable */ -void +static void env_pop_auto(eval_environ_t env) { @@ -507,5 +513,5 @@ env_pop_auto(eval_environ_t env) } -void +static void env_unregister_autos(eval_environ_t env) { @@ -513,5 +519,5 @@ env_unregister_autos(eval_environ_t env) } -void +static void env_fixup_autos(eval_environ_t env, ptrdiff_t offset) { @@ -519,5 +525,6 @@ env_fixup_autos(eval_environ_t env, ptrdiff_t offset) for (i = 0; i < env->numautos; i++) { STKVAL *pptr = env->auto_ptr[i]; - mf_c_val(*pptr,str) += offset; /*FIXME*/ + if (pptr) + mf_c_val(*pptr,str) += offset; /*FIXME*/ } } @@ -800,5 +807,5 @@ heap_obstack_grow(eval_environ_t env, void * MFL_DATASEG ptr, size_t size) char *ret; - env_register_auto(env, ptr); + env_register_auto(env, (void*) &ptr); if (env->tos - env->toh < words + B2STACK(env->temp_size)) expand_dataseg(env, words, @@ -830,5 +837,5 @@ pushs(eval_environ_t env, const char * MFL_DATASEG s) size_t off; - env_register_auto(env, (void*) s); + env_register_auto(env, (void*) &s); off = heap_reserve(env, strlen(s) + 1); strcpy((char*) env_data_ref(env, off), s); |