From f673e57a471fde12f33cdd244183c0e82c2aac27 Mon Sep 17 00:00:00 2001 From: Benjamin Kaufmann Date: Mon, 10 Jan 2022 17:44:47 +0100 Subject: [PATCH] Fix potential UB in creation of sdbus::Error. See https://github.com/Kistler-Group/sdbus-cpp/issues/231 --- include/sdbus-c++/Error.h | 5 +++++ tests/unittests/Types_test.cpp | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/include/sdbus-c++/Error.h b/include/sdbus-c++/Error.h index 92aeca2..099f71a 100644 --- a/include/sdbus-c++/Error.h +++ b/include/sdbus-c++/Error.h @@ -43,6 +43,11 @@ namespace sdbus { : public std::runtime_error { public: + explicit Error(const std::string& name, const char* message = nullptr) + : Error(name, std::string(message ? message : "")) + { + } + Error(const std::string& name, const std::string& message) : std::runtime_error("[" + name + "] " + message) , name_(name) diff --git a/tests/unittests/Types_test.cpp b/tests/unittests/Types_test.cpp index 41953a6..3be549f 100644 --- a/tests/unittests/Types_test.cpp +++ b/tests/unittests/Types_test.cpp @@ -344,3 +344,21 @@ TEST(AUnixFd, TakesOverNewFdAndClosesOriginalFdOnAdoptingReset) EXPECT_THAT(unixFd.get(), Eq(newFd)); EXPECT_THAT(::close(fd), Eq(-1)); } + +TEST(AnError, CanBeConstructedFromANameAndAMessage) +{ + auto error = sdbus::Error("name", "message"); + EXPECT_THAT(error.getName(), Eq("name")); + EXPECT_THAT(error.getMessage(), Eq("message")); +} + +TEST(AnError, CanBeConstructedFromANameOnly) +{ + auto error1 = sdbus::Error("name"); + auto error2 = sdbus::Error("name", nullptr); + EXPECT_THAT(error1.getName(), Eq("name")); + EXPECT_THAT(error2.getName(), Eq("name")); + + EXPECT_THAT(error1.getMessage(), Eq("")); + EXPECT_THAT(error2.getMessage(), Eq("")); +}