aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src
diff options
context:
space:
mode:
authorAlexander Karatarakis <alkarata@microsoft.com>2017-03-10 16:54:08 -0800
committerAlexander Karatarakis <alkarata@microsoft.com>2017-03-10 17:04:29 -0800
commit5f39474a17aefc754dcba7d07b2c6ec8a03fc07c (patch)
tree66b9e24232d548e84384a66da435050e443b44aa /toolsrc/src
parentb364239d0711a9749a61f16f2b101801e863b5c2 (diff)
downloadvcpkg-5f39474a17aefc754dcba7d07b2c6ec8a03fc07c.tar.gz
vcpkg-5f39474a17aefc754dcba7d07b2c6ec8a03fc07c.zip
Rework System::get_environmental_variable()
Diffstat (limited to 'toolsrc/src')
-rw-r--r--toolsrc/src/vcpkg_System.cpp18
1 files changed, 10 insertions, 8 deletions
diff --git a/toolsrc/src/vcpkg_System.cpp b/toolsrc/src/vcpkg_System.cpp
index 1730ff3ad..b333f36b0 100644
--- a/toolsrc/src/vcpkg_System.cpp
+++ b/toolsrc/src/vcpkg_System.cpp
@@ -1,5 +1,6 @@
#include "pch.h"
#include "vcpkg_System.h"
+#include "vcpkg_Checks.h"
namespace vcpkg::System
{
@@ -92,15 +93,16 @@ namespace vcpkg::System
optional<std::wstring> get_environmental_variable(const wchar_t* varname) noexcept
{
- wchar_t* buffer;
- _wdupenv_s(&buffer, nullptr, varname);
-
- if (buffer == nullptr)
- {
+ auto sz = GetEnvironmentVariableW(varname, nullptr, 0);
+ if (sz == 0)
return nullptr;
- }
- std::unique_ptr<wchar_t, void(__cdecl *)(void*)> bufptr(buffer, free);
- return std::make_unique<std::wstring>(buffer);
+
+ auto ret = std::make_unique<std::wstring>(sz, L'\0');
+ Checks::check_exit(MAXDWORD >= ret->size());
+ auto sz2 = GetEnvironmentVariableW(varname, ret->data(), static_cast<DWORD>(ret->size()));
+ Checks::check_exit(sz2 + 1 == sz);
+ ret->pop_back();
+ return ret;
}
void set_environmental_variable(const wchar_t* varname, const wchar_t* varvalue) noexcept