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 <stijn@linux-ipv6.be>
Tested-by: Stijn Tintel <stijn@linux-ipv6.be>
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
Jo-Philipp Wich 2022-07-27 16:18:52 +02:00
parent 0c16e10d03
commit 26afb7cbec
1 changed files with 30 additions and 0 deletions

View File

@ -20,6 +20,7 @@
#include <errno.h>
#include <string.h>
#include <math.h>
#include <dlfcn.h>
#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);
}