From e2f740cbdba65a4b6210e3eebfcd5d912f64089a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Wed, 15 Jan 2014 20:54:13 +0100
Subject: [PATCH] Runtime: Using FIND_LFUN() with non-LFUNS is an error.

Make sure to fatal if FIND_LFUN() is used with a fake LFUN.
---
 src/program.c | 8 +++++++-
 src/program.h | 3 ++-
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/program.c b/src/program.c
index 0b87ccab00..7bf426566f 100644
--- a/src/program.c
+++ b/src/program.c
@@ -6744,7 +6744,7 @@ PMOD_EXPORT int low_find_lfun(struct program *p, ptrdiff_t lfun)
   struct identifier *id;
 #endif
   if ((size_t)lfun >= NELEM(lfun_strings)) {
-      return -1;
+    return find_lfun_fatal(p, lfun);
   }
 
   lfun_name = lfun_strings[lfun];
@@ -6765,6 +6765,12 @@ PMOD_EXPORT int low_find_lfun(struct program *p, ptrdiff_t lfun)
   return i;
 }
 
+PMOD_EXPORT int find_lfun_fatal(struct program *p, ptrdiff_t lfun)
+{
+  Pike_fatal("Invalid lfun number: %d\n", lfun);
+  return -1;
+}
+
 int lfun_lookup_id(struct pike_string *lfun_name)
 {
   struct svalue *id = low_mapping_string_lookup(lfun_ids, lfun_name);
diff --git a/src/program.h b/src/program.h
index 322fdb19c5..0f8297422e 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 && (N) < NUM_LFUNS ?((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)]):find_lfun_fatal((P), (N)) )
 #define QUICK_FIND_LFUN(P,N) (dmalloc_touch(struct program *,(P))->lfuns[N])
 
 #ifdef DO_PIKE_CLEANUP
@@ -925,6 +925,7 @@ int really_low_find_variant_identifier(struct pike_string *name,
 				       int start_pos,
 				       int flags);
 PMOD_EXPORT int low_find_lfun(struct program *p, ptrdiff_t lfun);
+PMOD_EXPORT int find_lfun_fatal(struct program *p, ptrdiff_t lfun);
 int lfun_lookup_id(struct pike_string *lfun_name);
 int low_find_shared_string_identifier(struct pike_string *name,
 				      struct program *prog);
-- 
GitLab