From e4cb87ea9e7184111f05fa0a372c242f397e731d Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Fri, 27 Aug 2021 16:06:23 +0200 Subject: [PATCH] Fix loading `null` as Guid for object refs in C++ Json parser --- Source/Engine/Core/Config/GameSettings.cpp | 2 +- Source/Engine/Serialization/JsonTools.cpp | 22 ++++++++++++++++++++++ Source/Engine/Serialization/JsonTools.h | 19 +------------------ 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/Source/Engine/Core/Config/GameSettings.cpp b/Source/Engine/Core/Config/GameSettings.cpp index ee0bc1c19..3ae273867 100644 --- a/Source/Engine/Core/Config/GameSettings.cpp +++ b/Source/Engine/Core/Config/GameSettings.cpp @@ -188,7 +188,7 @@ void GameSettings::Deserialize(DeserializeStream& stream, ISerializeModifier* mo SplashScreen = JsonTools::GetGuid(stream, "SplashScreen"); CustomSettings.Clear(); const auto customSettings = stream.FindMember("CustomSettings"); - if (customSettings != stream.MemberEnd()) + if (customSettings != stream.MemberEnd() && customSettings->value.IsArray()) { auto& items = customSettings->value; for (auto it = items.MemberBegin(); it != items.MemberEnd(); ++it) diff --git a/Source/Engine/Serialization/JsonTools.cpp b/Source/Engine/Serialization/JsonTools.cpp index bb4ed4c6b..52722a3c7 100644 --- a/Source/Engine/Serialization/JsonTools.cpp +++ b/Source/Engine/Serialization/JsonTools.cpp @@ -103,6 +103,28 @@ Matrix JsonTools::GetMatrix(const Value& value) return result; } +Guid JsonTools::GetGuid(const Value& value) +{ + if (value.IsNull()) + return Guid::Empty; + CHECK_RETURN(value.GetStringLength() == 32, Guid::Empty); + + // Split + const char* a = value.GetString(); + const char* b = a + 8; + const char* c = b + 8; + const char* d = c + 8; + + // Parse + Guid result; + StringUtils::ParseHex(a, 8, &result.A); + StringUtils::ParseHex(b, 8, &result.B); + StringUtils::ParseHex(c, 8, &result.C); + StringUtils::ParseHex(d, 8, &result.D); + return result; +} + + DateTime JsonTools::GetDate(const Value& value) { return DateTime(value.GetInt64()); diff --git a/Source/Engine/Serialization/JsonTools.h b/Source/Engine/Serialization/JsonTools.h index 169309df4..4c61f4286 100644 --- a/Source/Engine/Serialization/JsonTools.h +++ b/Source/Engine/Serialization/JsonTools.h @@ -174,24 +174,7 @@ public: ); } - static Guid GetGuid(const Value& value) - { - CHECK_RETURN(value.GetStringLength() == 32, Guid::Empty); - - // Split - const char* a = value.GetString(); - const char* b = a + 8; - const char* c = b + 8; - const char* d = c + 8; - - // Parse - Guid result; - StringUtils::ParseHex(a, 8, &result.A); - StringUtils::ParseHex(b, 8, &result.B); - StringUtils::ParseHex(c, 8, &result.C); - StringUtils::ParseHex(d, 8, &result.D); - return result; - } + static Guid GetGuid(const Value& value); static DateTime GetDate(const Value& value);