From e7ae719b9a53433e5aac888bca9a9cba1b6a9da9 Mon Sep 17 00:00:00 2001 From: Qianqian Fang Date: Tue, 1 Mar 2022 22:51:16 -0500 Subject: [PATCH] ndarray can only be used with array containers, discard if used in object --- include/nlohmann/detail/input/binary_reader.hpp | 5 +++++ single_include/nlohmann/json.hpp | 5 +++++ test/src/unit-bjdata.cpp | 3 +++ 3 files changed, 13 insertions(+) diff --git a/include/nlohmann/detail/input/binary_reader.hpp b/include/nlohmann/detail/input/binary_reader.hpp index 9c606375a..ae4b10a9e 100644 --- a/include/nlohmann/detail/input/binary_reader.hpp +++ b/include/nlohmann/detail/input/binary_reader.hpp @@ -2500,6 +2500,11 @@ class binary_reader return false; } + if (input_format == input_format_t::bjdata && size_and_type.first != string_t::npos && size_and_type.first >= (1ull << (sizeof(std::size_t) * 8 - 1))) + { + return false; + } + string_t key; if (size_and_type.first != string_t::npos) { diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 73495b8d3..cd4063d57 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -10876,6 +10876,11 @@ class binary_reader return false; } + if (input_format == input_format_t::bjdata && size_and_type.first != string_t::npos && size_and_type.first >= (1ull << (sizeof(std::size_t) * 8 - 1))) + { + return false; + } + string_t key; if (size_and_type.first != string_t::npos) { diff --git a/test/src/unit-bjdata.cpp b/test/src/unit-bjdata.cpp index 283d7fa3a..5946181c7 100644 --- a/test/src/unit-bjdata.cpp +++ b/test/src/unit-bjdata.cpp @@ -2830,6 +2830,9 @@ TEST_CASE("BJData") CHECK_THROWS_AS(_ = json::from_bjdata(vST2), json::parse_error&); CHECK_THROWS_WITH(_ = json::from_bjdata(vST2), "[json.exception.parse_error.110] parse error at byte 8: syntax error while parsing BJData value: unexpected end of input"); CHECK(json::from_bjdata(vST2, true, false).is_discarded()); + + std::vector vO = {'{', '#', '[', 'i', 2, 'i', 1, ']', 'i', 1, 'a', 'i', 1, 'i', 1, 'b', 'i', 2}; + CHECK(json::from_bjdata(vO, true, false).is_discarded()); } }