diff options
author | Goswin von Brederlow <goswin-v-b@web.de> | 2023-01-13 10:36:52 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-13 09:36:52 +0000 |
commit | aad5c3a44d4386b2128b956446b2c6295a4c28ad (patch) | |
tree | 86fd18b3834b1f3b87f8f50085dfc006a26d34bd | |
parent | 50c74e645928affa1af6e9a5a6ea6a3b9d3c52dc (diff) | |
download | fuse-aad5c3a44d4386b2128b956446b2c6295a4c28ad.tar.gz |
Fix loading of FUSE modules
dlsym returns the address of the module factory symbol, not the actual function (#722)
pointer. Change the type of `factory` to `fuse_module_factory_t*` to reflect
this and then dereference it when registering the module.
This is a followup to d92bf83, which introduced a NULL pointer dereference
when dlsym returns NULL, and 8ec7fd9, which reverted it back to not
dereferencing the symbol at all.
Fixes: #721
Co-authored-by: Goswin von Brederlow <brederlo@q-leap.de>
-rw-r--r-- | lib/fuse.c | 6 |
1 files changed, 3 insertions, 3 deletions
@@ -249,7 +249,7 @@ static int fuse_load_so_module(const char *module) int ret = -1; char *tmp; struct fusemod_so *so; - fuse_module_factory_t factory; + fuse_module_factory_t *factory; tmp = malloc(strlen(module) + 64); if (!tmp) { @@ -271,13 +271,13 @@ static int fuse_load_so_module(const char *module) } sprintf(tmp, "fuse_module_%s_factory", module); - *(void**)(&factory) = dlsym(so->handle, tmp); + factory = (fuse_module_factory_t*)dlsym(so->handle, tmp); if (factory == NULL) { fuse_log(FUSE_LOG_ERR, "fuse: symbol <%s> not found in module: %s\n", tmp, dlerror()); goto out_dlclose; } - ret = fuse_register_module(module, factory, so); + ret = fuse_register_module(module, *factory, so); if (ret) goto out_dlclose; |