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