aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2023-06-13 07:23:08 +0200
committerGitHub <[email protected]>2023-06-13 07:23:08 +0200
commit6abbe430fe26146e8faeeee0573843cc79dddee0 (patch)
tree648ae77fc6bb87eaa2007e94f6db09dfe5737114
parentv0.2.13-pre2 (diff)
downloadzen-6abbe430fe26146e8faeeee0573843cc79dddee0.tar.xz
zen-6abbe430fe26146e8faeeee0573843cc79dddee0.zip
Make sure GetEnvVariable can handle values that are longer than 1023 characters (#332)
-rw-r--r--CHANGELOG.md1
-rw-r--r--src/zencore/filesystem.cpp22
2 files changed, 19 insertions, 4 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6e21d9941..8160a2be9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,7 @@
- Bugfix: Prevent destructors in ProjectStore::Project, ScopedActivityBase and FileMapping from throwing exceptions to avoid abort termination
- Bugfix: Zen CLI command help now include descriptions for positional arguments
- Bugfix: Correctly prefix auth token when using a bare token in project oplog import/export
+- Bugfix: Make sure GetEnvVariable can handle values that are longer than 1023 characters
- Improvement: Throw exception with information on failed memory allocation instead of calling ZEN_ASSERT
- Improvement: Added support for streaming decompression
- Improvement: Added zenserver.exe and zen.exe/zen.pdb to Sentry debug information upload to populate unwind information
diff --git a/src/zencore/filesystem.cpp b/src/zencore/filesystem.cpp
index 9d55331eb..cde4c52ab 100644
--- a/src/zencore/filesystem.cpp
+++ b/src/zencore/filesystem.cpp
@@ -1144,11 +1144,25 @@ GetEnvVariable(std::string_view VariableName)
ZEN_ASSERT(!VariableName.empty());
#if ZEN_PLATFORM_WINDOWS
- CHAR EnvVariableBuffer[1023 + 1];
- DWORD RESULT = GetEnvironmentVariableA(std::string(VariableName).c_str(), EnvVariableBuffer, sizeof(EnvVariableBuffer));
- if (RESULT > 0 && RESULT < sizeof(EnvVariableBuffer))
+ std::vector<CHAR> EnvVariableBuffer(1023 + 1);
+ DWORD RESULT = GetEnvironmentVariableA(std::string(VariableName).c_str(), EnvVariableBuffer.data(), (DWORD)EnvVariableBuffer.size());
+ if (RESULT == 0)
{
- return std::string(EnvVariableBuffer);
+ return "";
+ }
+ if (RESULT <= EnvVariableBuffer.size())
+ {
+ return std::string(EnvVariableBuffer.data(), size_t(RESULT));
+ }
+ EnvVariableBuffer.resize(size_t(RESULT));
+ RESULT = GetEnvironmentVariableA(std::string(VariableName).c_str(), EnvVariableBuffer.data(), (DWORD)EnvVariableBuffer.size());
+ if (RESULT == 0)
+ {
+ return "";
+ }
+ if (RESULT <= EnvVariableBuffer.size())
+ {
+ return std::string(EnvVariableBuffer.data(), size_t(RESULT));
}
#endif
#if ZEN_PLATFORM_LINUX || ZEN_PLATFORM_MAC