From 59277d3dca2a0f9d74d5b2ff44aa9b27c19858a2 Mon Sep 17 00:00:00 2001 From: Dave Pevreal Date: Wed, 7 Dec 2022 16:54:35 +1000 Subject: [PATCH] Fixed literal string parsing to allow unescaped quote character --- Source/udJSON.cpp | 8 +++++++- udTest/src/udJSONTests.cpp | 8 ++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Source/udJSON.cpp b/Source/udJSON.cpp index 6f1d03e7..57083f88 100644 --- a/Source/udJSON.cpp +++ b/Source/udJSON.cpp @@ -968,7 +968,13 @@ udResult udJSON::Parse(const char *pString, int *pCharCount, int *pLineNumber) } else if (*pString == '\"' || *pString == '\'') // Allow single quotes { - size_t endPos = udStrMatchBrace(pString, '\\'); + size_t endPos; + if (pCharCount) + endPos = udStrMatchBrace(pString, '\\'); + else + endPos = udStrlen(pString); + while (pString[endPos - 1] == ' ' || pString[endPos - 1] == '\t') + --endPos; // Force a parse error if the string isn't quoted properly UD_ERROR_IF(pString[endPos - 1] != pString[0], udR_ParseError); char *pStr = udAllocType(char, endPos, udAF_None); diff --git a/udTest/src/udJSONTests.cpp b/udTest/src/udJSONTests.cpp index 51479fd3..dee9babe 100644 --- a/udTest/src/udJSONTests.cpp +++ b/udTest/src/udJSONTests.cpp @@ -64,6 +64,14 @@ TEST(udJSONTests, CreationSimple) g_udBreakOnError = false; EXPECT_NE(udR_Success, v.Set("Settings.Something")); g_udBreakOnError = true; + + EXPECT_EQ(udR_Success, v.Set("Settings.MyString1 = 'has ' quote'")); // Literals accept quote character mid-string as a special case + EXPECT_EQ(udR_Success, v.Set("Settings.MyString2 = 'has \\' quote'")); // Quote character escaped + EXPECT_EQ(0, udStrcmp(v.Get("Settings.MyString1").AsString(), v.Get("Settings.MyString2").AsString())); + EXPECT_EQ(udR_Success, v.Set("Settings.MyString3 = \"has \\\" quote\" ")); // Test with double-quote character and trailing spaces + EXPECT_EQ(udR_Success, v.Set("Settings.MyString4 = 'has \" quote' ")); // Test with double-quote character and trailing spaces + EXPECT_EQ(0, udStrcmp(v.Get("Settings.MyString3").AsString(), v.Get("Settings.MyString4").AsString())); + EXPECT_EQ(udR_Success, v.Set("Settings.EmptyArray = []")); EXPECT_EQ(udR_Success, v.Set("Settings.Nothing = null")); // Of note here is that the input string is currently JSON escaped, so there's some additional backslashes