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