diff --git a/resources/ui/carla_settings.ui b/resources/ui/carla_settings.ui index 5c2f6f10f..7ab05427e 100644 --- a/resources/ui/carla_settings.ui +++ b/resources/ui/carla_settings.ui @@ -955,7 +955,7 @@ - Make UIs always-on-top + Make plugin UIs always-on-top @@ -1482,20 +1482,20 @@ - + Main - + Enable plugin bridges - + Load Carla backend in global namespace (NOT RECOMMENDED) @@ -1505,7 +1505,7 @@ - + Canvas @@ -1538,7 +1538,7 @@ - + Engine @@ -1554,6 +1554,13 @@ This mode is not available for VST plugins. + + + + Prevent plugins from doing bad stuff (needs restart) + + + diff --git a/source/backend/engine/CarlaEngine.cpp b/source/backend/engine/CarlaEngine.cpp index 67d9462d4..77f9e577a 100644 --- a/source/backend/engine/CarlaEngine.cpp +++ b/source/backend/engine/CarlaEngine.cpp @@ -1587,7 +1587,7 @@ void CarlaEngine::setOption(const EngineOption option, const int value, const ch #ifdef CARLA_OS_LINUX if (value != 0) { - CarlaString interposerPath(CarlaString(pData->options.binaryDir) + CARLA_OS_SEP_STR "libcarla_interposer.so"); + CarlaString interposerPath(CarlaString(pData->options.binaryDir) + "/libcarla_interposer-safe.so"); ::setenv("LD_PRELOAD", interposerPath.buffer(), 1); } else diff --git a/source/backend/plugin/CarlaPluginBridge.cpp b/source/backend/plugin/CarlaPluginBridge.cpp index e3e520025..511db8804 100644 --- a/source/backend/plugin/CarlaPluginBridge.cpp +++ b/source/backend/plugin/CarlaPluginBridge.cpp @@ -26,6 +26,7 @@ #include "CarlaBridgeUtils.hpp" #include "CarlaEngineUtils.hpp" #include "CarlaMathUtils.hpp" +#include "CarlaPipeUtils.hpp" #include "CarlaShmUtils.hpp" #include "CarlaThread.hpp" @@ -156,10 +157,8 @@ protected: const ScopedEngineEnvironmentLocker _seel(kEngine); #ifdef CARLA_OS_LINUX - const char* const oldPreload(std::getenv("LD_PRELOAD")); - - if (oldPreload != nullptr) - ::unsetenv("LD_PRELOAD"); + const ScopedEnvVar sev1("LD_LIBRARY_PATH", nullptr); + const ScopedEnvVar sev2("LD_PRELOAD", nullptr); #endif carla_setenv("ENGINE_OPTION_FORCE_STEREO", bool2str(options.forceStereo)); @@ -235,11 +234,6 @@ protected: fBinary.toRawUTF8(), getPluginTypeAsString(kPlugin->getType()), filename.toRawUTF8(), fLabel.toRawUTF8(), kPlugin->getUniqueId()); started = fProcess->start(arguments); - -#ifdef CARLA_OS_LINUX - if (oldPreload != nullptr) - ::setenv("LD_PRELOAD", oldPreload, 1); -#endif } if (! started) diff --git a/source/carla_backend.py b/source/carla_backend.py index 9b371ac52..583d7e807 100644 --- a/source/carla_backend.py +++ b/source/carla_backend.py @@ -1233,9 +1233,9 @@ class CarlaHostMeta(object): # settings self.experimental = False + self.forceStereo = False self.manageUIs = False self.maxParameters = 0 - self.forceStereo = False self.preferPluginBridges = False self.preferUIBridges = False self.preventBadBehaviour = False diff --git a/source/carla_database.py b/source/carla_database.py index 959ddfa61..a8dea777e 100755 --- a/source/carla_database.py +++ b/source/carla_database.py @@ -1044,9 +1044,9 @@ class PluginRefreshW(QDialog): self.loadSettings() # ---------------------------------------------------------------------------------------------------- - # Disable bridges (experimental for now) + # Hide bridges if disabled - if not host.experimental: + if not host.showPluginBridges: self.ui.ch_native.setChecked(True) self.ui.ch_native.setEnabled(False) self.ui.ch_native.setVisible(False) diff --git a/source/carla_host.py b/source/carla_host.py index 645c6a113..410d960ec 100644 --- a/source/carla_host.py +++ b/source/carla_host.py @@ -2586,16 +2586,14 @@ def setHostSettings(host): # kdevelop likes this :) if False: host = CarlaHostNull() - # TEST - #host.preventBadBehaviour = True host.set_engine_option(ENGINE_OPTION_FORCE_STEREO, host.forceStereo, "") + host.set_engine_option(ENGINE_OPTION_MAX_PARAMETERS, host.maxParameters, "") host.set_engine_option(ENGINE_OPTION_PREFER_PLUGIN_BRIDGES, host.preferPluginBridges, "") host.set_engine_option(ENGINE_OPTION_PREFER_UI_BRIDGES, host.preferUIBridges, "") - host.set_engine_option(ENGINE_OPTION_UIS_ALWAYS_ON_TOP, host.uisAlwaysOnTop, "") - host.set_engine_option(ENGINE_OPTION_MAX_PARAMETERS, host.maxParameters, "") - host.set_engine_option(ENGINE_OPTION_UI_BRIDGES_TIMEOUT, host.uiBridgesTimeout, "") host.set_engine_option(ENGINE_OPTION_PREVENT_BAD_BEHAVIOUR, host.preventBadBehaviour, "") host.set_engine_option(ENGINE_OPTION_DEBUG_CONSOLE_OUTPUT, host.showLogs, "") + host.set_engine_option(ENGINE_OPTION_UI_BRIDGES_TIMEOUT, host.uiBridgesTimeout, "") + host.set_engine_option(ENGINE_OPTION_UIS_ALWAYS_ON_TOP, host.uisAlwaysOnTop, "") if host.isPlugin: return diff --git a/source/carla_settings.py b/source/carla_settings.py index 8b1e1d47a..6722f7874 100755 --- a/source/carla_settings.py +++ b/source/carla_settings.py @@ -274,7 +274,7 @@ class CarlaSettingsW(QDialog): self.ui.ch_engine_force_stereo.setEnabled(False) if host.isControl or host.isPlugin: - self.ui.ch_advanced_load_lib_global.hide() + self.ui.ch_exp_load_lib_global.hide() # FIXME, pipes on win32 not working if WINDOWS: @@ -471,13 +471,17 @@ class CarlaSettingsW(QDialog): # ---------------------------------------------------------------------------------------------------- # Experimental - self.ui.cb_advanced_plugin_bridges.setChecked(settings.value(CARLA_KEY_EXPERIMENTAL_PLUGIN_BRIDGES, - CARLA_DEFAULT_EXPERIMENTAL_PLUGIN_BRIDGES, - type=bool)) + self.ui.cb_exp_plugin_bridges.setChecked(settings.value(CARLA_KEY_EXPERIMENTAL_PLUGIN_BRIDGES, + CARLA_DEFAULT_EXPERIMENTAL_PLUGIN_BRIDGES, + type=bool)) - self.ui.ch_advanced_load_lib_global.setChecked(settings.value(CARLA_KEY_EXPERIMENTAL_LOAD_LIB_GLOBAL, - CARLA_DEFAULT_EXPERIMENTAL_LOAD_LIB_GLOBAL, - type=bool)) + self.ui.ch_exp_load_lib_global.setChecked(settings.value(CARLA_KEY_EXPERIMENTAL_LOAD_LIB_GLOBAL, + CARLA_DEFAULT_EXPERIMENTAL_LOAD_LIB_GLOBAL, + type=bool)) + + self.ui.ch_exp_prevent_bad_behaviour.setChecked(settings.value(CARLA_KEY_EXPERIMENTAL_PREVENT_BAD_BEHAVIOUR, + CARLA_DEFAULT_EXPERIMENTAL_PREVENT_BAD_BEHAVIOUR, + type=bool)) # -------------------------------------------------------------------------------------------------------- @@ -493,18 +497,12 @@ class CarlaSettingsW(QDialog): # ---------------------------------------------------------------------------------------------------- # Main - self.host.showLogs = self.ui.ch_main_show_logs.isChecked() - self.host.uisAlwaysOnTop = self.ui.ch_engine_uis_always_on_top.isChecked() - settings.setValue(CARLA_KEY_MAIN_PROJECT_FOLDER, self.ui.le_main_proj_folder.text()) settings.setValue(CARLA_KEY_MAIN_USE_PRO_THEME, self.ui.ch_main_theme_pro.isChecked()) settings.setValue(CARLA_KEY_MAIN_PRO_THEME_COLOR, self.ui.cb_main_theme_color.currentText()) settings.setValue(CARLA_KEY_MAIN_REFRESH_INTERVAL, self.ui.sb_main_refresh_interval.value()) settings.setValue(CARLA_KEY_MAIN_USE_CUSTOM_SKINS, self.ui.ch_main_use_custom_skins.isChecked()) - settings.setValue(CARLA_KEY_MAIN_SHOW_LOGS, self.host.showLogs) - settings.setValue(CARLA_KEY_ENGINE_UIS_ALWAYS_ON_TOP, self.host.uisAlwaysOnTop) - # ---------------------------------------------------------------------------------------------------- # Canvas @@ -545,29 +543,33 @@ class CarlaSettingsW(QDialog): settings.setValue(CARLA_KEY_ENGINE_PROCESS_MODE, self.host.nextProcessMode) self.host.forceStereo = self.ui.ch_engine_force_stereo.isChecked() + self.host.maxParameters = self.ui.sb_engine_max_params.value() + self.host.manageUIs = self.ui.ch_engine_manage_uis.isChecked() self.host.preferPluginBridges = self.ui.ch_engine_prefer_plugin_bridges.isChecked() self.host.preferUIBridges = self.ui.ch_engine_prefer_ui_bridges.isChecked() - self.host.maxParameters = self.ui.sb_engine_max_params.value() + self.host.showLogs = self.ui.ch_main_show_logs.isChecked() self.host.uiBridgesTimeout = self.ui.sb_engine_ui_bridges_timeout.value() - self.host.manageUIs = self.ui.ch_engine_manage_uis.isChecked() + self.host.uisAlwaysOnTop = self.ui.ch_engine_uis_always_on_top.isChecked() if self.ui.ch_engine_force_stereo.isEnabled(): self.host.set_engine_option(ENGINE_OPTION_FORCE_STEREO, self.host.forceStereo, "") + self.host.set_engine_option(ENGINE_OPTION_MAX_PARAMETERS, self.host.maxParameters, "") self.host.set_engine_option(ENGINE_OPTION_PREFER_PLUGIN_BRIDGES, self.host.preferPluginBridges, "") self.host.set_engine_option(ENGINE_OPTION_PREFER_UI_BRIDGES, self.host.preferUIBridges, "") - self.host.set_engine_option(ENGINE_OPTION_UIS_ALWAYS_ON_TOP, self.host.uisAlwaysOnTop, "") - self.host.set_engine_option(ENGINE_OPTION_MAX_PARAMETERS, self.host.maxParameters, "") self.host.set_engine_option(ENGINE_OPTION_UI_BRIDGES_TIMEOUT, self.host.uiBridgesTimeout, "") + self.host.set_engine_option(ENGINE_OPTION_UIS_ALWAYS_ON_TOP, self.host.uisAlwaysOnTop, "") if self.ui.ch_engine_force_stereo.isEnabled(): settings.setValue(CARLA_KEY_ENGINE_FORCE_STEREO, self.host.forceStereo) + settings.setValue(CARLA_KEY_MAIN_SHOW_LOGS, self.host.showLogs) + settings.setValue(CARLA_KEY_ENGINE_MAX_PARAMETERS, self.host.maxParameters) + settings.setValue(CARLA_KEY_ENGINE_MANAGE_UIS, self.host.manageUIs) settings.setValue(CARLA_KEY_ENGINE_PREFER_PLUGIN_BRIDGES, self.host.preferPluginBridges) settings.setValue(CARLA_KEY_ENGINE_PREFER_UI_BRIDGES, self.host.preferUIBridges) - settings.setValue(CARLA_KEY_ENGINE_MAX_PARAMETERS, self.host.maxParameters) settings.setValue(CARLA_KEY_ENGINE_UI_BRIDGES_TIMEOUT, self.host.uiBridgesTimeout) - settings.setValue(CARLA_KEY_ENGINE_MANAGE_UIS, self.host.manageUIs) + settings.setValue(CARLA_KEY_ENGINE_UIS_ALWAYS_ON_TOP, self.host.uisAlwaysOnTop) # ---------------------------------------------------------------------------------------------------- # Paths @@ -626,8 +628,9 @@ class CarlaSettingsW(QDialog): # ---------------------------------------------------------------------------------------------------- # Experimental - settings.setValue(CARLA_KEY_EXPERIMENTAL_PLUGIN_BRIDGES, self.ui.cb_advanced_plugin_bridges.isChecked()) - settings.setValue(CARLA_KEY_EXPERIMENTAL_LOAD_LIB_GLOBAL, self.ui.ch_advanced_load_lib_global.isChecked()) + settings.setValue(CARLA_KEY_EXPERIMENTAL_PLUGIN_BRIDGES, self.ui.cb_exp_plugin_bridges.isChecked()) + settings.setValue(CARLA_KEY_EXPERIMENTAL_LOAD_LIB_GLOBAL, self.ui.ch_exp_load_lib_global.isChecked()) + settings.setValue(CARLA_KEY_EXPERIMENTAL_PREVENT_BAD_BEHAVIOUR, self.ui.ch_exp_prevent_bad_behaviour.isChecked()) # -------------------------------------------------------------------------------------------------------- @@ -763,8 +766,9 @@ class CarlaSettingsW(QDialog): def resetExperimentalSettings(self): # Forever experimental - self.ui.cb_advanced_plugin_bridges.setChecked(CARLA_DEFAULT_EXPERIMENTAL_PLUGIN_BRIDGES) - self.ui.ch_advanced_load_lib_global.setChecked(CARLA_DEFAULT_EXPERIMENTAL_LOAD_LIB_GLOBAL) + self.ui.cb_exp_plugin_bridges.setChecked(CARLA_DEFAULT_EXPERIMENTAL_PLUGIN_BRIDGES) + self.ui.ch_exp_load_lib_global.setChecked(CARLA_DEFAULT_EXPERIMENTAL_LOAD_LIB_GLOBAL) + self.ui.ch_exp_prevent_bad_behaviour.setChecked(CARLA_DEFAULT_EXPERIMENTAL_PREVENT_BAD_BEHAVIOUR) # Temporary, until stable self.ui.cb_canvas_fancy_eyecandy.setChecked(CARLA_DEFAULT_CANVAS_FANCY_EYE_CANDY) diff --git a/source/interposer/interposer-safe.cpp b/source/interposer/interposer-safe.cpp index 4c09f2cf0..056c7fe27 100644 --- a/source/interposer/interposer-safe.cpp +++ b/source/interposer/interposer-safe.cpp @@ -22,13 +22,15 @@ #include #include +#define PREVENTED_FUNC_MSG carla_stderr2("Carla prevented a plugin from calling '%s', bad plugin!", __FUNCTION__) + // ----------------------------------------------------------------------- // Our custom functions CARLA_EXPORT pid_t fork() { - carla_stdout("------------------------------- fork called"); + PREVENTED_FUNC_MSG; errno = ENOSYS; return -1; } @@ -36,7 +38,7 @@ pid_t fork() CARLA_EXPORT int clone(int (*)(void*), void*, int, void*, ...) { - carla_stdout("------------------------------- clone called"); + PREVENTED_FUNC_MSG; errno = ENOSYS; return -1; } @@ -44,15 +46,37 @@ int clone(int (*)(void*), void*, int, void*, ...) CARLA_EXPORT int posix_spawn(pid_t*, const char*, const posix_spawn_file_actions_t*, const posix_spawnattr_t*, char* const[], char* const[]) { - carla_stdout("------------------------------- posix_spawn called"); + PREVENTED_FUNC_MSG; return ENOSYS; } CARLA_EXPORT int posix_spawnp(pid_t*, const char*, const posix_spawn_file_actions_t*, const posix_spawnattr_t*, char* const[], char* const[]) { - carla_stdout("------------------------------- posix_spawnp called"); + PREVENTED_FUNC_MSG; return ENOSYS; } // ----------------------------------------------------------------------- + +CARLA_EXPORT +void gtk_init(int*, char***) +{ + PREVENTED_FUNC_MSG; +} + +CARLA_EXPORT +int gtk_init_check(int*, char***) +{ + PREVENTED_FUNC_MSG; + return 0; +} + +CARLA_EXPORT +int gtk_init_with_args(int*, char***, const char*, void*, const char*, void**) +{ + PREVENTED_FUNC_MSG; + return 0; +} + +// ----------------------------------------------------------------------- diff --git a/source/utils/CarlaPipeUtils.cpp b/source/utils/CarlaPipeUtils.cpp index 2749c83ea..2c67c6f72 100644 --- a/source/utils/CarlaPipeUtils.cpp +++ b/source/utils/CarlaPipeUtils.cpp @@ -197,7 +197,8 @@ bool waitForClientConnect(const HANDLE pipe, const uint32_t timeOutMilliseconds) static inline bool startProcess(const char* const argv[], pid_t& pidinst) noexcept { - const ScopedEnvVar sev("LD_LIBRARY_PATH", nullptr); + const ScopedEnvVar sev1("LD_LIBRARY_PATH", nullptr); + const ScopedEnvVar sev2("LD_PRELOAD", nullptr); const pid_t ret = pidinst = vfork();