Skip to content

Commit 8110058

Browse files
committed
Fix support for NUL characters in deserializeJson()
1 parent 7946ebe commit 8110058

File tree

4 files changed

+20
-4
lines changed

4 files changed

+20
-4
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
ArduinoJson: change log
22
=======================
33

4+
HEAD
5+
----
6+
7+
* Fix support for NUL characters in `deserializeJson()`
8+
49
v7.2.1 (2024-11-15)
510
------
611

extras/tests/JsonDeserializer/filter.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -693,6 +693,15 @@ TEST_CASE("Filtering") {
693693
"null",
694694
0,
695695
},
696+
{
697+
"NUL character in key",
698+
"{\"x\":0,\"x\\u0000a\":1,\"x\\u0000b\":2}",
699+
"{\"x\\u0000a\":true}",
700+
10,
701+
DeserializationError::Ok,
702+
"{\"x\\u0000a\":1}",
703+
sizeofObject(1) + sizeofString("x?a"),
704+
},
696705
};
697706

698707
for (auto& tc : testCases) {

extras/tests/JsonDeserializer/object.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <catch.hpp>
77

88
#include "Allocators.hpp"
9+
#include "Literals.hpp"
910

1011
using ArduinoJson::detail::sizeofObject;
1112

@@ -322,10 +323,11 @@ TEST_CASE("deserialize JSON object") {
322323

323324
SECTION("NUL in keys") {
324325
DeserializationError err =
325-
deserializeJson(doc, "{\"x\\u0000a\":1,\"x\\u0000b\":2}");
326+
deserializeJson(doc, "{\"x\":0,\"x\\u0000a\":1,\"x\\u0000b\":2}");
326327

327328
REQUIRE(err == DeserializationError::Ok);
328-
REQUIRE(doc.as<std::string>() == "{\"x\\u0000a\":1,\"x\\u0000b\":2}");
329+
REQUIRE(doc.as<std::string>() ==
330+
"{\"x\":0,\"x\\u0000a\":1,\"x\\u0000b\":2}");
329331
}
330332
}
331333

src/ArduinoJson/Json/JsonDeserializer.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,10 +270,10 @@ class JsonDeserializer {
270270

271271
JsonString key = stringBuilder_.str();
272272

273-
TFilter memberFilter = filter[key.c_str()];
273+
TFilter memberFilter = filter[key];
274274

275275
if (memberFilter.allow()) {
276-
auto member = object.getMember(adaptString(key.c_str()), resources_);
276+
auto member = object.getMember(adaptString(key), resources_);
277277
if (!member) {
278278
// Save key in memory pool.
279279
auto savedKey = stringBuilder_.save();

0 commit comments

Comments
 (0)