From: Jo-Philipp Wich Date: Wed, 27 Jul 2022 14:18:52 +0000 (+0200) Subject: ucode-mod-lua: add workaround for dynamic Lua extension loading X-Git-Url: http://git.openwrt.org/?a=commitdiff_plain;h=26afb7cbec6108b23c9381937489bb05a833c7e6;p=project%2Fluci.git ucode-mod-lua: add workaround for dynamic Lua extension loading Reopen self with dlopen(RTLD_GLOBAL) in order to export liblua symbols for runtime loading of dynamic Lua extensions. Reported-by: Stijn Tintel Tested-by: Stijn Tintel Signed-off-by: Jo-Philipp Wich --- diff --git a/contrib/package/ucode-mod-lua/src/lua.c b/contrib/package/ucode-mod-lua/src/lua.c index 7a5b9b9612..679425fae5 100644 --- a/contrib/package/ucode-mod-lua/src/lua.c +++ b/contrib/package/ucode-mod-lua/src/lua.c @@ -20,6 +20,7 @@ #include #include #include +#include #include "ucode/module.h" @@ -948,10 +949,39 @@ free_lv(void *ud) free(lv); } +static void +dlopen_self(uc_vm_t *vm) +{ + uc_value_t *search, *entry; + char *path, *wildcard; + void *dlh = NULL; + size_t i; + + search = ucv_property_get(uc_vm_scope_get(vm), "REQUIRE_SEARCH_PATH"); + + for (i = 0; !dlh && i < ucv_array_length(search); i++) { + entry = ucv_array_get(search, i); + path = ucv_string_get(entry); + wildcard = path ? strchr(path, '*') : NULL; + + if (wildcard) { + xasprintf(&path, "%.*slua%s", (int)(wildcard - path), path, wildcard + 1); + dlh = dlopen(path, RTLD_LAZY|RTLD_GLOBAL); + dlerror(); /* clear error */ + free(path); + } + } +} + void uc_module_init(uc_vm_t *vm, uc_value_t *scope) { uc_function_list_register(scope, lua_fns); vm_type = uc_type_declare(vm, "lua.vm", vm_fns, free_vm); lv_type = uc_type_declare(vm, "lua.value", lv_fns, free_lv); + + /* reopen ourself using dlopen(RTLD_GLOBAL) to make liblua symbols + * available to dynamic Lua extensions loaded by this module through + * Lua's require() */ + dlopen_self(vm); }