Browse Source

Add ScopedEnvVar class, use it to safely pass LV2_PATH to bridges

Closes #195
tags/1.9.6
falkTX 10 years ago
parent
commit
d2745d8484
4 changed files with 92 additions and 3 deletions
  1. +12
    -3
      source/backend/plugin/CarlaPluginLV2.cpp
  2. +47
    -0
      source/utils/CarlaPipeUtils.cpp
  3. +16
    -0
      source/utils/CarlaPipeUtils.hpp
  4. +17
    -0
      source/utils/CarlaUtils.hpp

+ 12
- 3
source/backend/plugin/CarlaPluginLV2.cpp View File

@@ -25,6 +25,7 @@
#include "CarlaLv2Utils.hpp" #include "CarlaLv2Utils.hpp"


#include "CarlaBase64Utils.hpp" #include "CarlaBase64Utils.hpp"
#include "CarlaEngineUtils.hpp"
#include "CarlaPipeUtils.hpp" #include "CarlaPipeUtils.hpp"
#include "CarlaPluginUI.hpp" #include "CarlaPluginUI.hpp"
#include "Lv2AtomRingBuffer.hpp" #include "Lv2AtomRingBuffer.hpp"
@@ -393,8 +394,9 @@ public:
UiCrashed UiCrashed
}; };


CarlaPipeServerLV2(CarlaPluginLV2* const plugin)
: kPlugin(plugin),
CarlaPipeServerLV2(CarlaEngine* const engine, CarlaPluginLV2* const plugin)
: kEngine(engine),
kPlugin(plugin),
fFilename(), fFilename(),
fPluginURI(), fPluginURI(),
fUiURI(), fUiURI(),
@@ -422,6 +424,12 @@ public:


bool startPipeServer() noexcept bool startPipeServer() noexcept
{ {
const ScopedEngineEnvironmentLocker _seel(kEngine);
const ScopedEnvVar _sev1("LV2_PATH", kEngine->getOptions().pathLV2);
#ifdef CARLA_OS_LINUX
const ScopedEnvVar _sev2("LD_PRELOAD", nullptr);
#endif

return CarlaPipeServer::startPipeServer(fFilename, fPluginURI, fUiURI); return CarlaPipeServer::startPipeServer(fFilename, fPluginURI, fUiURI);
} }


@@ -470,6 +478,7 @@ protected:
bool msgReceived(const char* const msg) noexcept override; bool msgReceived(const char* const msg) noexcept override;


private: private:
CarlaEngine* const kEngine;
CarlaPluginLV2* const kPlugin; CarlaPluginLV2* const kPlugin;


CarlaString fFilename; CarlaString fFilename;
@@ -506,7 +515,7 @@ public:
fEventsIn(), fEventsIn(),
fEventsOut(), fEventsOut(),
fLv2Options(), fLv2Options(),
fPipeServer(this),
fPipeServer(engine, this),
fCustomURIDs(), fCustomURIDs(),
fFirstActive(true), fFirstActive(true),
fLastStateChunk(nullptr), fLastStateChunk(nullptr),


+ 47
- 0
source/utils/CarlaPipeUtils.cpp View File

@@ -1558,6 +1558,53 @@ void CarlaPipeClient::closePipeClient() noexcept


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------


ScopedEnvVar::ScopedEnvVar(const char* const key, const char* const value) noexcept
: fKey(nullptr),
fOrigValue(nullptr)
{
CARLA_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0',);

fKey = carla_strdup_safe(key);
CARLA_SAFE_ASSERT_RETURN(fKey != nullptr,);

if (const char* const origValue = std::getenv(key))
{
fOrigValue = carla_strdup_safe(origValue);
CARLA_SAFE_ASSERT_RETURN(fOrigValue != nullptr,);
}

if (value != nullptr)
carla_setenv(key, value);
else if (fOrigValue != nullptr)
carla_unsetenv(key);
}

ScopedEnvVar::~ScopedEnvVar() noexcept
{
bool hasOrigValue = false;

if (fOrigValue != nullptr)
{
hasOrigValue = true;

carla_setenv(fKey, fOrigValue);

delete[] fOrigValue;
fOrigValue = nullptr;
}

if (fKey != nullptr)
{
if (! hasOrigValue)
carla_unsetenv(fKey);

delete[] fKey;
fKey = nullptr;
}
}

// -----------------------------------------------------------------------

ScopedLocale::ScopedLocale() noexcept ScopedLocale::ScopedLocale() noexcept
: fLocale(carla_strdup_safe(::setlocale(LC_NUMERIC, nullptr))) : fLocale(carla_strdup_safe(::setlocale(LC_NUMERIC, nullptr)))
{ {


+ 16
- 0
source/utils/CarlaPipeUtils.hpp View File

@@ -319,6 +319,22 @@ public:
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPipeClient) CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPipeClient)
}; };


// -----------------------------------------------------------------------
// ScopedEnvVar class

class ScopedEnvVar {
public:
ScopedEnvVar(const char* const key, const char* const value) noexcept;
~ScopedEnvVar() noexcept;

private:
const char* fKey;
const char* fOrigValue;

CARLA_DECLARE_NON_COPY_CLASS(ScopedEnvVar)
CARLA_PREVENT_HEAP_ALLOCATION
};

// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// ScopedLocale class // ScopedLocale class




+ 17
- 0
source/utils/CarlaUtils.hpp View File

@@ -258,6 +258,23 @@ void carla_setenv(const char* const key, const char* const value) noexcept
#endif #endif
} }


/*
* Unset environment variable 'key'.
*/
static inline
void carla_unsetenv(const char* const key) noexcept
{
CARLA_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0',);

#ifdef CARLA_OS_WIN
try {
::SetEnvironmentVariableA(key, nullptr);
} CARLA_SAFE_EXCEPTION("carla_unsetenv");
#else
::unsetenv(key);
#endif
}

// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// carla_strdup // carla_strdup




Loading…
Cancel
Save