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 "CarlaBase64Utils.hpp"
#include "CarlaEngineUtils.hpp"
#include "CarlaPipeUtils.hpp"
#include "CarlaPluginUI.hpp"
#include "Lv2AtomRingBuffer.hpp"
@@ -393,8 +394,9 @@ public:
UiCrashed
};

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

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

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

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

CarlaString fFilename;
@@ -506,7 +515,7 @@ public:
fEventsIn(),
fEventsOut(),
fLv2Options(),
fPipeServer(this),
fPipeServer(engine, this),
fCustomURIDs(),
fFirstActive(true),
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
: 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)
};

// -----------------------------------------------------------------------
// 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



+ 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
}

/*
* 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



Loading…
Cancel
Save