From 89378e8862a8a93f9ec806ce055972873c9382b3 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Thu, 21 Apr 2022 14:21:26 +0200 Subject: [PATCH] Handle dlsym() failures in chainloaders better If these ever fail (because the function names change, not that that should happen anytime soon) then you'll now get the expected logging output instead of it just printing an assertion failure to the terminal. --- src/chainloader/utils.cpp | 20 ++++++++++++++++++++ src/chainloader/utils.h | 7 +++++++ src/chainloader/vst2-chainloader.cpp | 5 ++++- src/chainloader/vst3-chainloader.cpp | 5 ++++- 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/chainloader/utils.cpp b/src/chainloader/utils.cpp index 4e36bdd6..ccd65d33 100644 --- a/src/chainloader/utils.cpp +++ b/src/chainloader/utils.cpp @@ -104,3 +104,23 @@ void* find_plugin_library(const std::string& name) { return handle; } + +void log_failing_dlsym(const std::string& library_name, + const char* function_name) { + const fs::path this_plugin_path = get_this_file_location(); + + Logger logger = Logger::create_exception_logger(); + + logger.log(""); + logger.log("Could not find '" + std::string(function_name) + "' in '" + + library_name + "'"); + logger.log(""); + logger.log("Try rerunning 'yabridgectl sync'."); + logger.log(""); + logger.log("Source: '" + this_plugin_path.string() + "'"); + logger.log(""); + + send_notification("Could not find '" + std::string(function_name) + + "' in '" + library_name + "'", + "Try rerunning 'yabridgectl sync'.", this_plugin_path); +} diff --git a/src/chainloader/utils.h b/src/chainloader/utils.h index 0bd2c769..b572eb3d 100644 --- a/src/chainloader/utils.h +++ b/src/chainloader/utils.h @@ -37,3 +37,10 @@ * directories in case `ldconfig` was not set up correctly. */ void* find_plugin_library(const std::string& name); + +/** + * Log a message when a `dlsym()` call fails and show a corresponding desktop + * notification. Used as part of the `LOAD_FUNCTION` macros. + */ +void log_failing_dlsym(const std::string& library_name, + const char* function_name); diff --git a/src/chainloader/vst2-chainloader.cpp b/src/chainloader/vst2-chainloader.cpp index 030bebaf..2078fde5 100644 --- a/src/chainloader/vst2-chainloader.cpp +++ b/src/chainloader/vst2-chainloader.cpp @@ -76,7 +76,10 @@ bool initialize_library() { do { \ (name) = \ reinterpret_cast(dlsym(library_handle, #name)); \ - assert(name); \ + if (!(name)) { \ + log_failing_dlsym(yabridge_vst2_plugin_name, #name); \ + return false; \ + } \ } while (false) LOAD_FUNCTION(yabridge_plugin_init); diff --git a/src/chainloader/vst3-chainloader.cpp b/src/chainloader/vst3-chainloader.cpp index 3ce91113..103084c5 100644 --- a/src/chainloader/vst3-chainloader.cpp +++ b/src/chainloader/vst3-chainloader.cpp @@ -94,7 +94,10 @@ bool initialize_library() { do { \ (name) = \ reinterpret_cast(dlsym(library_handle, #name)); \ - assert(name); \ + if (!(name)) { \ + log_failing_dlsym(yabridge_vst3_plugin_name, #name); \ + return false; \ + } \ } while (false) LOAD_FUNCTION(yabridge_module_init);