From f8ddaae70bbbfaacc799b85559eb462863d49bb1 Mon Sep 17 00:00:00 2001 From: Steve Murphy Date: Thu, 25 Sep 2008 17:51:11 +0000 Subject: (closes issue #13558) Reported by: mnicholson Considering that the example extensions.lua used nothing but ["12345"] notation, and that the resulting error message: [Sep 24 17:01:16] ERROR[12393]: pbx_lua.c:1204 exec: Error executing lua extension: attempt to call a nil value is not very informative as to the nature of the problem, I think this bug fix is a big win! git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@144482 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- pbx/pbx_lua.c | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) (limited to 'pbx/pbx_lua.c') diff --git a/pbx/pbx_lua.c b/pbx/pbx_lua.c index 689ba1c77..6a98e302a 100644 --- a/pbx/pbx_lua.c +++ b/pbx/pbx_lua.c @@ -1193,22 +1193,25 @@ static int lua_find_extension(lua_State *L, const char *context, const char *ext /* step through the extensions looking for a match */ for (i = 1; i < lua_objlen(L, context_order_table) + 1; i++) { - int e_index, isnumber, match = 0; + int e_index, e_index_copy, match = 0; const char *e; lua_pushinteger(L, i); lua_gettable(L, context_order_table); e_index = lua_gettop(L); - isnumber = lua_isnumber(L, e_index); - if (!(e = lua_tostring(L, e_index))) { - lua_pop(L, 1); + /* copy the key at the top of the stack for use later */ + lua_pushvalue(L, -1); + e_index_copy = lua_gettop(L); + + if (!(e = lua_tostring(L, e_index_copy))) { + lua_pop(L, 2); continue; } /* make sure this is not the 'include' extension */ if (!strcasecmp(e, "include")) { - lua_pop(L, 1); + lua_pop(L, 2); continue; } @@ -1223,34 +1226,28 @@ static int lua_find_extension(lua_State *L, const char *context, const char *ext * match, 2 on earlymatch */ if (!match) { - lua_pop(L, 1); + /* pop the copy and the extension */ + lua_pop(L, 2); continue; /* keep trying */ } if (func == &matchmore && match == 2) { /* We match an extension ending in '!'. The decision in * this case is final and counts as no match. */ - lua_pop(L, 3); + lua_pop(L, 4); return 0; } - /* remove the context table, the context order table, and the - * extension (or replace the extension with the corisponding - * function) */ + /* remove the context table, the context order table, the + * extension, and the extension copy (or replace the extension + * with the corresponding function) */ if (push_func) { - /* here we must convert the exten back to an integer - * because lua_tostring will change the value on the - * stack to a string */ - if (isnumber) { - int e_int = lua_tointeger(L, e_index); - lua_pop(L, 1); /* the exten should be the top of the stack */ - lua_pushinteger(L, e_int); - } + lua_pop(L, 1); /* pop the copy */ lua_gettable(L, context_table); lua_insert(L, -3); lua_pop(L, 2); } else { - lua_pop(L, 3); + lua_pop(L, 4); } return 1; -- cgit v1.2.3