diff --git a/src/program.c b/src/program.c index 3f69fd5c5b9881c48535b72d515510100712adf6..143ad27571d978dcb19b25e50e8ccd8354862bb1 100644 --- a/src/program.c +++ b/src/program.c @@ -6736,16 +6736,22 @@ static void f_dispatch_variant(INT32 args) PMOD_EXPORT int low_find_lfun(struct program *p, ptrdiff_t lfun) { - struct pike_string *lfun_name = lfun_strings[lfun]; + struct pike_string *lfun_name; unsigned int flags = 0; + int i; #if 0 struct identifier *id; #endif - int i = - really_low_find_shared_string_identifier(lfun_name, - dmalloc_touch(struct program *, - p), - SEE_PROTECTED); + if ((size_t)lfun >= NELEM(lfun_strings)) { + return -1; + } + + lfun_name = lfun_strings[lfun]; + + i = really_low_find_shared_string_identifier(lfun_name, + dmalloc_touch(struct program *, + p), + SEE_PROTECTED); #if 0 if (i < 0 || !(p->flags & PROGRAM_FIXED)) return i; id = ID_FROM_INT(p, i); diff --git a/src/program.h b/src/program.h index 35a86e7068b064facc5bda2f7c231dbb087e8998..322fdb19c5ad84e9b340b1d4cf1ee61995866903 100644 --- a/src/program.h +++ b/src/program.h @@ -668,7 +668,7 @@ static INLINE int CHECK_IDREF_RANGE (int x, const struct program *p) #define PROG_FROM_INT(P,X) PROG_FROM_PTR(P, PTR_FROM_INT(P, X)) #define ID_FROM_INT(P,X) ID_FROM_PTR(P, PTR_FROM_INT(P, X)) -#define FIND_LFUN(P,N) ( dmalloc_touch(struct program *,(P))->flags & PROGRAM_FIXED?((P)->lfuns[(N)]):low_find_lfun((P), (N)) ) +#define FIND_LFUN(P,N) ( dmalloc_touch(struct program *,(P))->flags & PROGRAM_FIXED && (N) < NUM_LFUNS ?((P)->lfuns[(N)]):low_find_lfun((P), (N)) ) #define QUICK_FIND_LFUN(P,N) (dmalloc_touch(struct program *,(P))->lfuns[N]) #ifdef DO_PIKE_CLEANUP