mirror of
https://github.com/nlohmann/json.git
synced 2026-10-01 22:45:17 +00:00
Trim the compiler-appended NUL from wide/UTF string literals too (#5702)
With JSON_STRICT_NUL_HANDLING defined to 1, parsing a wide, UTF-16, UTF-32, or (C++20) UTF-8 string literal (e.g. json::parse(L"[1]")) failed with parse_error.101 at the terminating NUL of the literal, and accept() returned false. The array overload of input_adapter() only dropped the compiler-added trailing '\0' for arrays of char, so for wchar_t, char16_t, char32_t, and char8_t arrays that terminator was passed to the parser as data, which the macro then rejected. Broaden the trimming to every character type that a string literal can use (char, wchar_t, char16_t, char32_t, and, since C++20, char8_t). Arrays of any other element type (unsigned char, std::uint8_t, ...), as used for CBOR/MessagePack, are unaffected: a trailing zero byte there is still read as genuine data. Fixes #5658. Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
@@ -645,6 +645,30 @@ TEST_CASE("parser class")
|
||||
// carries a compiler-appended trailing '\0') still works,
|
||||
// even though a NUL byte is now rejected everywhere else
|
||||
CHECK(json::parse("123") == json(123));
|
||||
|
||||
// regression test for issue #5658: the same holds for wide,
|
||||
// UTF-16, UTF-32, and (C++20) UTF-8 string literals, whose
|
||||
// compiler-appended trailing '\0' is not of type `char`
|
||||
CHECK(json::parse(L"[1]") == json({1}));
|
||||
CHECK(json::accept(L"[1]"));
|
||||
CHECK(json::parse(u"[1]") == json({1}));
|
||||
CHECK(json::accept(u"[1]"));
|
||||
CHECK(json::parse(U"[1]") == json({1}));
|
||||
CHECK(json::accept(U"[1]"));
|
||||
#if defined(__cpp_char8_t)
|
||||
CHECK(json::parse(u8"[1]") == json({1}));
|
||||
CHECK(json::accept(u8"[1]"));
|
||||
#endif
|
||||
|
||||
// a NUL byte inside such a literal, as opposed to the single
|
||||
// compiler-appended trailing one, is still rejected
|
||||
{
|
||||
json _; // NOLINT(readability-identifier-naming)
|
||||
CHECK_THROWS_WITH_AS(_ = json::parse(L"[1\0]"),
|
||||
"[json.exception.parse_error.101] parse error at line 1, column 3: syntax error while parsing array - invalid literal; last read: '1<U+0000>'; expected ']'",
|
||||
json::parse_error&);
|
||||
CHECK_FALSE(json::accept(L"[1\0]"));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user