From a3a9d5665e1663b52d026dc475c84b97973aae8a Mon Sep 17 00:00:00 2001 From: jprochazk Date: Sun, 19 Jul 2020 09:35:49 +0200 Subject: [PATCH 1/4] add break to binary_reader::get_binary and get_string --- include/nlohmann/detail/input/binary_reader.hpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/include/nlohmann/detail/input/binary_reader.hpp b/include/nlohmann/detail/input/binary_reader.hpp index a650b2d0..45fcfff4 100644 --- a/include/nlohmann/detail/input/binary_reader.hpp +++ b/include/nlohmann/detail/input/binary_reader.hpp @@ -2271,15 +2271,15 @@ class binary_reader string_t& result) { bool success = true; - std::generate_n(std::back_inserter(result), len, [this, &success, &format]() - { + for(NumberType i = 0; i < len; i++) { get(); if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "string"))) { success = false; + break; } return std::char_traits::to_char_type(current); - }); + }; return success; } @@ -2303,15 +2303,15 @@ class binary_reader binary_t& result) { bool success = true; - std::generate_n(std::back_inserter(result), len, [this, &success, &format]() - { + for(NumberType i = 0; i < len; i++) { get(); if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "binary"))) { success = false; + break; } return static_cast(current); - }); + } return success; } From ab25de05f7316a745cb6392827d42870b9bc0a35 Mon Sep 17 00:00:00 2001 From: jprochazk Date: Sun, 19 Jul 2020 10:51:13 +0200 Subject: [PATCH 2/4] fix: return -> result.push_back --- include/nlohmann/detail/input/binary_reader.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/nlohmann/detail/input/binary_reader.hpp b/include/nlohmann/detail/input/binary_reader.hpp index 45fcfff4..f0c73f1b 100644 --- a/include/nlohmann/detail/input/binary_reader.hpp +++ b/include/nlohmann/detail/input/binary_reader.hpp @@ -2278,7 +2278,7 @@ class binary_reader success = false; break; } - return std::char_traits::to_char_type(current); + result.push_back(std::char_traits::to_char_type(current)); }; return success; } @@ -2310,7 +2310,7 @@ class binary_reader success = false; break; } - return static_cast(current); + result.push_back(static_cast(current)); } return success; } From d371a5283cae129c4346515a40d9bd9a65f3d9b4 Mon Sep 17 00:00:00 2001 From: jprochazk Date: Sun, 19 Jul 2020 10:57:17 +0200 Subject: [PATCH 3/4] run amalgamate --- include/nlohmann/detail/input/binary_reader.hpp | 6 ++++-- single_include/nlohmann/json.hpp | 14 ++++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/include/nlohmann/detail/input/binary_reader.hpp b/include/nlohmann/detail/input/binary_reader.hpp index f0c73f1b..0b649d02 100644 --- a/include/nlohmann/detail/input/binary_reader.hpp +++ b/include/nlohmann/detail/input/binary_reader.hpp @@ -2271,7 +2271,8 @@ class binary_reader string_t& result) { bool success = true; - for(NumberType i = 0; i < len; i++) { + for (NumberType i = 0; i < len; i++) + { get(); if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "string"))) { @@ -2303,7 +2304,8 @@ class binary_reader binary_t& result) { bool success = true; - for(NumberType i = 0; i < len; i++) { + for (NumberType i = 0; i < len; i++) + { get(); if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "binary"))) { diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 1d8b5fb6..2057c543 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -8136,15 +8136,16 @@ class binary_reader string_t& result) { bool success = true; - std::generate_n(std::back_inserter(result), len, [this, &success, &format]() + for (NumberType i = 0; i < len; i++) { get(); if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "string"))) { success = false; + break; } - return std::char_traits::to_char_type(current); - }); + result.push_back(std::char_traits::to_char_type(current)); + }; return success; } @@ -8168,15 +8169,16 @@ class binary_reader binary_t& result) { bool success = true; - std::generate_n(std::back_inserter(result), len, [this, &success, &format]() + for (NumberType i = 0; i < len; i++) { get(); if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "binary"))) { success = false; + break; } - return static_cast(current); - }); + result.push_back(static_cast(current)); + } return success; } From 851315c878923c8c21483f5472d3632de0fb242f Mon Sep 17 00:00:00 2001 From: jprochazk Date: Sun, 19 Jul 2020 18:35:58 +0200 Subject: [PATCH 4/4] add regression test --- test/src/unit-regression.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/src/unit-regression.cpp b/test/src/unit-regression.cpp index 7415f68a..b33c39ec 100644 --- a/test/src/unit-regression.cpp +++ b/test/src/unit-regression.cpp @@ -1954,6 +1954,16 @@ TEST_CASE("regression tests") auto val = j.value("x", defval); auto val2 = j.value("y", defval); } + + SECTION("issue #2293 - eof doesnt cause parsing to stop") + { + std::vector data = + { + 0x7B, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x20, 0x4F, 0x42 + }; + json result = json::from_cbor(data, true, false); + CHECK(result.is_discarded()); + } } #if !defined(JSON_NOEXCEPTION)