Author: Ebuka Ezike Date: 2026-08-28T16:11:09+01:00 New Revision: 69db8489be2f4e3cb1cf3f874403481d206b545c
URL: https://github.com/llvm/llvm-project/commit/69db8489be2f4e3cb1cf3f874403481d206b545c DIFF: https://github.com/llvm/llvm-project/commit/69db8489be2f4e3cb1cf3f874403481d206b545c.diff LOG: [lldb][API] Fix SBEnvironment crash when Set is called with a nullptr. (#218906) Crashed because std::string is constructed with a nullptr. Wrap with `llvm::StringRef`. Add a unittest Added: lldb/unittests/API/SBEnvironmentTest.cpp Modified: lldb/source/API/SBEnvironment.cpp lldb/unittests/API/CMakeLists.txt Removed: ################################################################################ diff --git a/lldb/source/API/SBEnvironment.cpp b/lldb/source/API/SBEnvironment.cpp index 5fafabe02e014..67676aec19dfc 100644 --- a/lldb/source/API/SBEnvironment.cpp +++ b/lldb/source/API/SBEnvironment.cpp @@ -75,17 +75,26 @@ const char *SBEnvironment::GetValueAtIndex(size_t index) { bool SBEnvironment::Set(const char *name, const char *value, bool overwrite) { LLDB_INSTRUMENT_VA(this, name, value, overwrite); + llvm::StringRef name_ref{name}; + if (name_ref.trim().empty()) + return false; + + llvm::StringRef value_ref{value}; if (overwrite) { - m_opaque_up->insert_or_assign(name, std::string(value)); + m_opaque_up->insert_or_assign(name_ref, value_ref.str()); return true; } - return m_opaque_up->try_emplace(name, std::string(value)).second; + return m_opaque_up->try_emplace(name_ref, value_ref.str()).second; } bool SBEnvironment::Unset(const char *name) { LLDB_INSTRUMENT_VA(this, name); - return m_opaque_up->erase(name); + llvm::StringRef name_ref{name}; + if (name_ref.trim().empty()) + return false; + + return m_opaque_up->erase(name_ref); } SBStringList SBEnvironment::GetEntries() { diff --git a/lldb/unittests/API/CMakeLists.txt b/lldb/unittests/API/CMakeLists.txt index 6a62be11cd7aa..f6cf7fd37a6d2 100644 --- a/lldb/unittests/API/CMakeLists.txt +++ b/lldb/unittests/API/CMakeLists.txt @@ -1,5 +1,6 @@ add_lldb_unittest(APITests SBCommandInterpreterTest.cpp + SBEnvironmentTest.cpp SBLineEntryTest.cpp SBMutexTest.cpp SBBreakpointClearConditionTest.cpp diff --git a/lldb/unittests/API/SBEnvironmentTest.cpp b/lldb/unittests/API/SBEnvironmentTest.cpp new file mode 100644 index 0000000000000..f18711dcdb994 --- /dev/null +++ b/lldb/unittests/API/SBEnvironmentTest.cpp @@ -0,0 +1,36 @@ +//===-- SBEnvironment.cpp -------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===/ + +// Use the umbrella header for -Wdocumentation. +#include "lldb/API/LLDB.h" + +#include "lldb/API/SBEnvironment.h" +#include "gtest/gtest.h" + +TEST(SBEnvironmentTest, SetAndGetEnv) { + + lldb::SBEnvironment env{}; + + // Setting an env var without a value does not crash. + EXPECT_TRUE(env.Set("FOO", nullptr, false)); + const char *foo_val = env.Get("FOO"); + EXPECT_STREQ(foo_val, ""); + + EXPECT_TRUE(env.Set("BAR", "BAR_VALUE", true)); + EXPECT_TRUE(env.Set("BAR", nullptr, true)); + const char *bar_val = env.Get("BAR"); + EXPECT_STREQ(bar_val, "") << "'BAR' should return the most recent value"; + + EXPECT_FALSE(env.Set(nullptr, "VALUE", true)); + EXPECT_FALSE(env.Set("", "VALUE", true)); + EXPECT_FALSE(env.Set(" ", "VALUE", true)); + + EXPECT_FALSE(env.Get(nullptr)); + EXPECT_FALSE(env.Get("")); + EXPECT_FALSE(env.Get(" ")); +} _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
