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();