From 9ea1bbefe83d86f07b9f273081d18721a29e64dc Mon Sep 17 00:00:00 2001 From: Mykola Solianko Date: Mon, 8 Sep 2025 17:22:34 +0300 Subject: [PATCH 1/9] sm: networkmanager: fix remove instance Previously, when deleting a network we iterated over all its instances and called a cleanup function for each. That function also cleared the cache, which removed the instance object from the map we were iterating. This caused undefined behavior in the loop. The cleanup logic has been adjusted to avoid modifying the container while iterating. Signed-off-by: Mykola Solianko Reviewed-by: Mykhailo Lohvynenko Reviewed-by: Mykola Kobets Reviewed-by: Oleksandr Grytsov --- include/aos/sm/networkmanager.hpp | 1 + src/sm/networkmanager/networkmanager.cpp | 49 ++++++++++++++++-------- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/include/aos/sm/networkmanager.hpp b/include/aos/sm/networkmanager.hpp index 060220e44..3dc7b0a78 100644 --- a/include/aos/sm/networkmanager.hpp +++ b/include/aos/sm/networkmanager.hpp @@ -758,6 +758,7 @@ class NetworkManager : public NetworkManagerItf { Error CreateNetwork(const NetworkInfo& network); Error GenerateVlanIfName(String& vlanIfName); Error DeleteInstanceNetworkConfig(const String& instanceID, const String& networkID); + Error CleanupInstanceNetworkResources(const String& instanceID, const String& networkID); StorageItf* mStorage {}; cni::CNIItf* mCNI {}; diff --git a/src/sm/networkmanager/networkmanager.cpp b/src/sm/networkmanager/networkmanager.cpp index 1a4627238..5dc8c39fc 100644 --- a/src/sm/networkmanager/networkmanager.cpp +++ b/src/sm/networkmanager/networkmanager.cpp @@ -261,6 +261,32 @@ Error NetworkManager::RemoveInstanceFromNetwork(const String& instanceID, const Error err; + if (auto errCleanupResources = CleanupInstanceNetworkResources(instanceID, networkID); + !errCleanupResources.IsNone()) { + if (err.IsNone()) { + err = errCleanupResources; + } + } + + if (auto errRemoveFromCache = RemoveInstanceFromCache(instanceID, networkID); + !errRemoveFromCache.IsNone() && err.IsNone()) { + err = errRemoveFromCache; + } + + if (!err.IsNone()) { + return err; + } + + LOG_DBG() << "Instance removed from network" << Log::Field("instanceID", instanceID) + << Log::Field("networkID", networkID); + + return ErrorEnum::eNone; +} + +Error NetworkManager::CleanupInstanceNetworkResources(const String& instanceID, const String& networkID) +{ + Error err; + if (auto errStopInstanceMonitoring = mNetMonitor->StopInstanceMonitoring(instanceID); !errStopInstanceMonitoring.IsNone()) { if (err.IsNone()) { @@ -275,13 +301,6 @@ Error NetworkManager::RemoveInstanceFromNetwork(const String& instanceID, const } } - if (auto errRemoveInstanceFromCache = RemoveInstanceFromCache(instanceID, networkID); - !errRemoveInstanceFromCache.IsNone()) { - if (err.IsNone()) { - err = errRemoveInstanceFromCache; - } - } - if (auto errRemoveInstanceFromStorage = mStorage->RemoveInstanceNetworkInfo(instanceID); !errRemoveInstanceFromStorage.IsNone()) { if (err.IsNone()) { @@ -289,14 +308,7 @@ Error NetworkManager::RemoveInstanceFromNetwork(const String& instanceID, const } } - if (!err.IsNone()) { - return err; - } - - LOG_DBG() << "Instance removed from network" << Log::Field("instanceID", instanceID) - << Log::Field("networkID", networkID); - - return ErrorEnum::eNone; + return err; } Error NetworkManager::DeleteInstanceNetworkConfig(const String& instanceID, const String& networkID) @@ -1005,10 +1017,15 @@ Error NetworkManager::RemoveNetwork(const String& networkID) Error err; for (const auto& instance : provider->mSecond) { - if (auto errRemoveInstance = RemoveInstanceFromNetwork(instance.mFirst, networkID); + if (auto errRemoveInstance = CleanupInstanceNetworkResources(instance.mFirst, networkID); !errRemoveInstance.IsNone() && err.IsNone()) { err = errRemoveInstance; } + + if (auto errRemoveFromCache = RemoveInstanceFromCache(instance.mFirst, networkID); + !errRemoveFromCache.IsNone() && err.IsNone()) { + err = errRemoveFromCache; + } } return err; From 502144427fadcab49e4e8f18eacd9b886a9e1a0f Mon Sep 17 00:00:00 2001 From: Mykhailo Lohvynenko Date: Fri, 19 Sep 2025 14:12:38 +0300 Subject: [PATCH 2/9] common: config: increase device name length to 64 Signed-off-by: Mykhailo Lohvynenko Reviewed-by: Mykola Kobets Reviewed-by: Oleksandr Grytsov --- include/aos/common/config.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/aos/common/config.hpp b/include/aos/common/config.hpp index ff5adcea5..59d69d04b 100644 --- a/include/aos/common/config.hpp +++ b/include/aos/common/config.hpp @@ -222,7 +222,7 @@ * Host device name len. */ #ifndef AOS_CONFIG_TYPES_DEVICE_NAME_LEN -#define AOS_CONFIG_TYPES_DEVICE_NAME_LEN 16 +#define AOS_CONFIG_TYPES_DEVICE_NAME_LEN 64 #endif /** From a489ba9507bd5784ddcd8b3b31e959dda153e17a Mon Sep 17 00:00:00 2001 From: Mykhailo Lohvynenko Date: Fri, 19 Sep 2025 14:13:05 +0300 Subject: [PATCH 3/9] common: config: increase resource name length to 64 Signed-off-by: Mykhailo Lohvynenko Reviewed-by: Mykola Kobets Reviewed-by: Oleksandr Grytsov --- include/aos/common/config.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/aos/common/config.hpp b/include/aos/common/config.hpp index 59d69d04b..ce950b7c9 100644 --- a/include/aos/common/config.hpp +++ b/include/aos/common/config.hpp @@ -236,7 +236,7 @@ * Resource name len. */ #ifndef AOS_CONFIG_TYPES_RESOURCE_NAME_LEN -#define AOS_CONFIG_TYPES_RESOURCE_NAME_LEN 16 +#define AOS_CONFIG_TYPES_RESOURCE_NAME_LEN 64 #endif /** From a2b776023b1c2faaa785d115701398cb83bdcbab Mon Sep 17 00:00:00 2001 From: Mykhailo Lohvynenko Date: Mon, 8 Sep 2025 15:15:23 +0300 Subject: [PATCH 4/9] common: tools: add string compare function This patch introduces a string compare function that allows comparison of two strings, supporting both case-sensitive and case-insensitive modes. Signed-off-by: Mykhailo Lohvynenko Reviewed-by: Mykola Kobets Reviewed-by: Mykola Solianko Reviewed-by: Oleksandr Grytsov --- include/aos/common/tools/string.hpp | 22 ++++++++++++++++++++++ tests/common/src/tools/string_test.cpp | 16 ++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/include/aos/common/tools/string.hpp b/include/aos/common/tools/string.hpp index 27ae58fb9..0cb655618 100644 --- a/include/aos/common/tools/string.hpp +++ b/include/aos/common/tools/string.hpp @@ -24,6 +24,11 @@ namespace aos { */ class String : public Array { public: + enum class CaseSensitivity { + CaseInsensitive, + CaseSensitive, + }; + /** * Creates string. */ @@ -765,6 +770,23 @@ class String : public Array { return {Size(), ErrorEnum::eNotFound}; } + + /** + * Compares string with another string. + * + * @param str string to compare with. + * @param caseSensitivity comparation case sensitivity. + * @return int: 0 - if strings are equal, <0 - if current string is less than str, + * >0 - if current string is greater than str. + */ + int Compare(const String& str, CaseSensitivity caseSensitivity = CaseSensitivity::CaseSensitive) const + { + if (caseSensitivity == CaseSensitivity::CaseSensitive) { + return strcmp(CStr(), str.CStr()); + } + + return strcasecmp(CStr(), str.CStr()); + } }; /** diff --git a/tests/common/src/tools/string_test.cpp b/tests/common/src/tools/string_test.cpp index 52e4c3053..8848c9aaa 100644 --- a/tests/common/src/tools/string_test.cpp +++ b/tests/common/src/tools/string_test.cpp @@ -412,3 +412,19 @@ TEST(StringTest, Replace) EXPECT_TRUE(err.IsNone()); EXPECT_EQ(str, "Hi Aos! Goodbye Universe!"); } + +TEST(StringTest, Compare) +{ + const auto cLhsStr = String("Test string"); + + EXPECT_EQ(cLhsStr.Compare("Test string"), 0); + EXPECT_LT(cLhsStr.Compare("Test string1"), 0); + EXPECT_LT(cLhsStr.Compare("Test strinh"), 0); + EXPECT_GT(cLhsStr.Compare("Test strina"), 0); + EXPECT_GT(cLhsStr.Compare("Test"), 0); + + EXPECT_EQ(cLhsStr.Compare("Test string", String::CaseSensitivity::CaseInsensitive), 0); + EXPECT_EQ(cLhsStr.Compare("test string", String::CaseSensitivity::CaseInsensitive), 0); + EXPECT_EQ(cLhsStr.Compare("TEST STRING", String::CaseSensitivity::CaseInsensitive), 0); + EXPECT_LT(cLhsStr.Compare("TEST STRING1", String::CaseSensitivity::CaseInsensitive), 0); +} From 0cd73e7d9dd01265654562dc1c2abb2c335cfd4a Mon Sep 17 00:00:00 2001 From: Mykhailo Lohvynenko Date: Fri, 19 Sep 2025 15:25:54 +0300 Subject: [PATCH 5/9] iam: nodeinfoprovider: use string case compare method This patch replaces the custom case-insensitive string comparison function with String::Compare method. Signed-off-by: Mykhailo Lohvynenko Reviewed-by: Mykola Kobets Reviewed-by: Mykola Solianko Reviewed-by: Oleksandr Grytsov --- src/iam/nodeinfoprovider/nodeinfoprovider.cpp | 20 +++---------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/src/iam/nodeinfoprovider/nodeinfoprovider.cpp b/src/iam/nodeinfoprovider/nodeinfoprovider.cpp index 2745d04f3..3b268879b 100644 --- a/src/iam/nodeinfoprovider/nodeinfoprovider.cpp +++ b/src/iam/nodeinfoprovider/nodeinfoprovider.cpp @@ -7,27 +7,13 @@ #include "aos/iam/nodeinfoprovider.hpp" -static bool CaseInsensitiveEqual(const aos::String& lhs, const aos::String& rhs) -{ - if (lhs.Size() != rhs.Size()) { - return false; - } - - for (size_t i = 0; i < lhs.Size(); ++i) { - if (tolower(lhs[i]) != tolower(rhs[i])) { - return false; - } - } - - return true; -} - namespace aos::iam::nodeinfoprovider { bool IsMainNode(const NodeInfo& nodeInfo) { - return nodeInfo.mAttrs.FindIf([](const auto& attr) { return CaseInsensitiveEqual(attr.mName, cAttrMainNode); }) - != nodeInfo.mAttrs.end(); + return nodeInfo.mAttrs.FindIf([](const auto& attr) { + return !attr.mName.Compare(cAttrMainNode, String::CaseSensitivity::CaseInsensitive); + }) != nodeInfo.mAttrs.end(); } } // namespace aos::iam::nodeinfoprovider From 859e9fe8ea249ab996feec9c14381a4dd623b40f Mon Sep 17 00:00:00 2001 From: Mykhailo Lohvynenko Date: Fri, 19 Sep 2025 15:27:57 +0300 Subject: [PATCH 6/9] sm: launcher: use case-insensitive string comparison Use case-insensitive string comparison instead of converting string to lower case for OS check. Signed-off-by: Mykhailo Lohvynenko Reviewed-by: Mykola Kobets Reviewed-by: Mykola Solianko Reviewed-by: Oleksandr Grytsov --- src/sm/launcher/instance.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/sm/launcher/instance.cpp b/src/sm/launcher/instance.cpp index 6e441e125..f9fc194d7 100644 --- a/src/sm/launcher/instance.cpp +++ b/src/sm/launcher/instance.cpp @@ -254,9 +254,7 @@ Error Instance::CreateAosEnvVars(oci::RuntimeSpec& runtimeSpec) Error Instance::ApplyImageConfig(const oci::ImageSpec& imageSpec, oci::RuntimeSpec& runtimeSpec) { - StaticString os = imageSpec.mOS; - - if (os.ToLower() != cLinuxOS) { + if (imageSpec.mOS.Compare(cLinuxOS, String::CaseSensitivity::CaseInsensitive) != 0) { return AOS_ERROR_WRAP(Error(ErrorEnum::eNotSupported, "unsupported OS in image config")); } From dde57f1b08b3c02d30a323bdf2b5fa2bd7a04393 Mon Sep 17 00:00:00 2001 From: Mykhailo Lohvynenko Date: Wed, 24 Sep 2025 13:47:09 +0300 Subject: [PATCH 7/9] common: tools: string: add strings.h include This adds missed include for strcasecmp function. Signed-off-by: Mykhailo Lohvynenko Reviewed-by: Mykola Kobets Reviewed-by: Mykola Solianko Reviewed-by: Oleksandr Grytsov --- include/aos/common/tools/string.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/include/aos/common/tools/string.hpp b/include/aos/common/tools/string.hpp index 0cb655618..76e0b89d2 100644 --- a/include/aos/common/tools/string.hpp +++ b/include/aos/common/tools/string.hpp @@ -14,6 +14,7 @@ #include #include #include +#include #include "aos/common/tools/array.hpp" From d0a1e792870c1f22cccbeb62740cfe98ac88d101 Mon Sep 17 00:00:00 2001 From: Mykola Solianko Date: Mon, 15 Sep 2025 21:07:07 +0300 Subject: [PATCH 8/9] common: tools: fix String FindSubstr method When trying to find a substring in a string, and this substring is located at the end of the string, it does not include the end of the string. For example: - Original string: /path/to/file_sample.txt - Substring: file_sample.txt Without the fix, it stops at the next chunk: /file_sample.txt. Signed-off-by: Mykola Solianko Reviewed-by: Mykola Kobets Reviewed-by: Mykhailo Lohvynenko Reviewed-by: Oleksandr Grytsov --- include/aos/common/tools/string.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/aos/common/tools/string.hpp b/include/aos/common/tools/string.hpp index 76e0b89d2..d546cf43c 100644 --- a/include/aos/common/tools/string.hpp +++ b/include/aos/common/tools/string.hpp @@ -736,11 +736,11 @@ class String : public Array { */ RetWithError FindSubstr(size_t startPos, const String& substr) const { - if (substr.Size() > Size()) { + if (substr.Size() == 0 || substr.Size() > Size()) { return {Size(), ErrorEnum::eNotFound}; } - for (size_t i = startPos; i < Size() - substr.Size(); i++) { + for (size_t i = startPos; i <= Size() - substr.Size(); i++) { const auto chunk = Array(CStr() + i, substr.Size()); if (chunk == substr) { From 2f48d804f2c37f0ae521e0ae4ebd7964498d64c8 Mon Sep 17 00:00:00 2001 From: Mykhailo Lohvynenko Date: Fri, 3 Oct 2025 13:48:40 +0300 Subject: [PATCH 9/9] common: tools: string: add replace the whole string test This patch adds a test case for replacing the entire content of a string using the Replace method. Signed-off-by: Mykhailo Lohvynenko Reviewed-by: Mykola Kobets Reviewed-by: Mykola Solianko Reviewed-by: Oleksandr Grytsov --- tests/common/src/tools/string_test.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/common/src/tools/string_test.cpp b/tests/common/src/tools/string_test.cpp index 8848c9aaa..dd2e8f920 100644 --- a/tests/common/src/tools/string_test.cpp +++ b/tests/common/src/tools/string_test.cpp @@ -411,6 +411,12 @@ TEST(StringTest, Replace) err = str.Replace("Universe", "Aos", 1); EXPECT_TRUE(err.IsNone()); EXPECT_EQ(str, "Hi Aos! Goodbye Universe!"); + + str = "Replace the whole string"; + + err = str.Replace(str, "replaced", 1); + EXPECT_TRUE(err.IsNone()); + EXPECT_EQ(str, "replaced"); } TEST(StringTest, Compare)