diff --git a/include/QF/progs.h b/include/QF/progs.h index 769fdb533..5a00afd46 100644 --- a/include/QF/progs.h +++ b/include/QF/progs.h @@ -1942,7 +1942,8 @@ struct progs_s { pr_def_t *pr_fielddefs; dstatement_t *pr_statements; pr_type_t *pr_globals; - unsigned globals_size; + pr_uint_t globals_size; + pr_uint_t null_size; ///< size of block considered null page pr_uivec4_t pr_bases; ///< base registers (index in opcode) ///@} diff --git a/libs/gamecode/pr_exec.c b/libs/gamecode/pr_exec.c index 200e0c0d8..89890908f 100644 --- a/libs/gamecode/pr_exec.c +++ b/libs/gamecode/pr_exec.c @@ -351,7 +351,7 @@ PR_LeaveFunction (progs_t *pr, int to_engine) VISIBLE void PR_BoundsCheckSize (progs_t *pr, pr_ptr_t addr, unsigned size) { - if (addr < (pr_ptr_t) (pr->pr_return - pr->pr_globals)) + if (addr < pr->null_size) PR_RunError (pr, "null pointer access"); if (addr >= pr->globals_size || size > (unsigned) (pr->globals_size - addr)) diff --git a/libs/gamecode/pr_resolve.c b/libs/gamecode/pr_resolve.c index 864baa443..008c1abed 100644 --- a/libs/gamecode/pr_resolve.c +++ b/libs/gamecode/pr_resolve.c @@ -142,6 +142,7 @@ PR_ResolveGlobals (progs_t *pr) goto error; pr->pr_param_alignment = G_INT (pr, def->ofs); } + pr->null_size = pr->pr_return - pr->pr_globals; memcpy (pr->pr_real_params, pr->pr_params, sizeof (pr->pr_params)); if (!pr->globals.ftime) {//FIXME double time if ((def = PR_FindGlobal (pr, "time")))