From: Bernd Schubert Date: Sat, 4 Jan 2025 22:18:14 +0000 (+0100) Subject: Make fuse_main_real() not symboled X-Git-Tag: fuse-3.17.1-rc0~20 X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=1d134a0ccf8fe95ceb1ea3cdd723cb30c5cfcdf1;p=qemu-gpiodev%2Flibfuse.git Make fuse_main_real() not symboled Addresses https://github.com/libfuse/libfuse/issues/1092 We actually don't need to make fuse_main_real() symboled, as it is not part of the official API. The inlined function now always calls into fuse_main_real_317 and the compat ABI function (which should also be available for dlopen/dlsym) is now always compiled, independent if the compiler/linker support versioned symbols. Additionally, fuse_main_real() is also declared as inlined function and a warning message is created when that function is called. Signed-off-by: Bernd Schubert --- diff --git a/include/fuse.h b/include/fuse.h index c3add84..969ed97 100644 --- a/include/fuse.h +++ b/include/fuse.h @@ -877,21 +877,32 @@ struct fuse_context { mode_t umask; }; -#if (defined(LIBFUSE_BUILT_WITH_VERSIONED_SYMBOLS)) /** * The real main function * * Do not call this directly, use fuse_main() */ -int fuse_main_real(int argc, char *argv[], const struct fuse_operations *op, - size_t op_size, struct libfuse_version *version, - void *user_data); -#else -int fuse_main_real_317(int argc, char *argv[], const struct fuse_operations *op, - size_t op_size, struct libfuse_version *version, void *user_data); -#define fuse_main_real(argc, argv, op, op_size, version, user_data) \ - fuse_main_real_317(argc, argv, op, op_size, version, user_data); -#endif +static inline int fuse_main_real(int argc, char *argv[], + const struct fuse_operations *op, + size_t op_size, void *user_data) +{ + struct libfuse_version version = { .major = FUSE_MAJOR_VERSION, + .minor = FUSE_MINOR_VERSION, + .hotfix = FUSE_HOTFIX_VERSION, + .padding = 0 }; + + fuse_log(FUSE_LOG_ERR, + "%s is a libfuse internal function, please use fuse_main()\n", + __func__); + + /* not declared globally, to restrict usage of this function */ + int fuse_main_real_317(int argc, char *argv[], + const struct fuse_operations *op, size_t op_size, + struct libfuse_version *version, + void *user_data); + + return fuse_main_real_317(argc, argv, op, op_size, &version, user_data); +} /** * Main function of FUSE. @@ -957,8 +968,14 @@ fuse_main(int argc, char *argv[], const struct fuse_operations *op, .hotfix = FUSE_HOTFIX_VERSION, .padding = 0 }; - return fuse_main_real(argc, argv, op, sizeof(*(op)), &version, - user_data); + + /* not declared globally, to restrict usage of this function */ + int fuse_main_real_317(int argc, char *argv[], + const struct fuse_operations *op, size_t op_size, + struct libfuse_version *version, + void *user_data); + return fuse_main_real_317(argc, argv, op, sizeof(*(op)), &version, + user_data); } /* ----------------------------------------------------------- * diff --git a/lib/compat.c b/lib/compat.c index ce8a933..6852299 100644 --- a/lib/compat.c +++ b/lib/compat.c @@ -18,6 +18,7 @@ #include "libfuse_config.h" #include +#include struct fuse_args; struct fuse_cmdline_opts; @@ -59,16 +60,6 @@ int fuse_session_custom_io(struct fuse_session *se, return fuse_session_custom_io_30(se, io, fd); } -int fuse_main_real_30(int argc, char *argv[], const struct fuse_operations *op, - size_t op_size, void *user_data); -int fuse_main_real(int argc, char *argv[], const struct fuse_operations *op, - size_t op_size, void *user_data); -int fuse_main_real(int argc, char *argv[], const struct fuse_operations *op, - size_t op_size, void *user_data) -{ - return fuse_main_real_30(argc, argv, op, op_size, user_data); -} - struct fuse_session *fuse_session_new_30(struct fuse_args *args, const struct fuse_lowlevel_ops *op, size_t op_size, void *userdata); @@ -82,6 +73,14 @@ struct fuse_session *fuse_session_new(struct fuse_args *args, return fuse_session_new_30(args, op, op_size, userdata); } -#endif - +#endif /* LIBFUSE_BUILT_WITH_VERSIONED_SYMBOLS */ +int fuse_main_real_30(int argc, char *argv[], const struct fuse_operations *op, + size_t op_size, void *user_data); +int fuse_main_real(int argc, char *argv[], const struct fuse_operations *op, + size_t op_size, void *user_data); +int fuse_main_real(int argc, char *argv[], const struct fuse_operations *op, + size_t op_size, void *user_data) +{ + return fuse_main_real_30(argc, argv, op, op_size, user_data); +} diff --git a/lib/fuse_versionscript b/lib/fuse_versionscript index f20e2b4..78df3f0 100644 --- a/lib/fuse_versionscript +++ b/lib/fuse_versionscript @@ -189,10 +189,10 @@ FUSE_3.12 { FUSE_3.17 { global: + fuse_main_real_317; #if !defined(LIBFUSE_BUILT_WITH_VERSIONED_SYMBOLS) _fuse_session_new_317; _fuse_new_317; - fuse_main_real_317; #endif fuse_passthrough_open; fuse_passthrough_close; diff --git a/lib/helper.c b/lib/helper.c index 2794e66..660f029 100644 --- a/lib/helper.c +++ b/lib/helper.c @@ -304,9 +304,10 @@ int fuse_daemonize(int foreground) return 0; } +/* Not symboled, as not part of the official API */ int fuse_main_real_317(int argc, char *argv[], const struct fuse_operations *op, - size_t op_size, struct libfuse_version *version, void *user_data); -FUSE_SYMVER("fuse_main_real_317", "fuse_main_real@@FUSE_3.17") + size_t op_size, struct libfuse_version *version, + void *user_data); int fuse_main_real_317(int argc, char *argv[], const struct fuse_operations *op, size_t op_size, struct libfuse_version *version, void *user_data) { @@ -400,14 +401,13 @@ out1: return res; } +/* Not symboled, as not part of the official API */ int fuse_main_real_30(int argc, char *argv[], const struct fuse_operations *op, size_t op_size, void *user_data); -FUSE_SYMVER("fuse_main_real_30", "fuse_main_real@FUSE_3.0") int fuse_main_real_30(int argc, char *argv[], const struct fuse_operations *op, size_t op_size, void *user_data) { struct libfuse_version version = { 0 }; - return fuse_main_real_317(argc, argv, op, op_size, &version, user_data); }