diff --git a/extras/tests/MsgPackDeserializer/errors.cpp b/extras/tests/MsgPackDeserializer/errors.cpp index 01e761af..dff712ab 100644 --- a/extras/tests/MsgPackDeserializer/errors.cpp +++ b/extras/tests/MsgPackDeserializer/errors.cpp @@ -199,3 +199,44 @@ TEST_CASE( REQUIRE(err == DeserializationError::NoMemory); } } + +TEST_CASE( + "deserializeMsgPack() returns NoMemory if extension allocation fails") { + JsonDocument doc(FailingAllocator::instance()); + + SECTION("uint32_t should pass") { + auto err = deserializeMsgPack(doc, "\xceXXXX"); + + REQUIRE(err == DeserializationError::Ok); + } + + SECTION("uint64_t should fail") { + auto err = deserializeMsgPack(doc, "\xcfXXXXXXXX"); + + REQUIRE(err == DeserializationError::NoMemory); + } + + SECTION("int32_t should pass") { + auto err = deserializeMsgPack(doc, "\xd2XXXX"); + + REQUIRE(err == DeserializationError::Ok); + } + + SECTION("int64_t should fail") { + auto err = deserializeMsgPack(doc, "\xd3XXXXXXXX"); + + REQUIRE(err == DeserializationError::NoMemory); + } + + SECTION("float should pass") { + auto err = deserializeMsgPack(doc, "\xcaXXXX"); + + REQUIRE(err == DeserializationError::Ok); + } + + SECTION("double should fail") { + auto err = deserializeMsgPack(doc, "\xcbXXXXXXXX"); + + REQUIRE(err == DeserializationError::NoMemory); + } +} diff --git a/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp b/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp index 7b64299a..0c32f58b 100644 --- a/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp +++ b/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp @@ -230,13 +230,16 @@ class MsgPackDeserializer { if (isSigned) { auto truncatedValue = static_cast(signedValue); - if (truncatedValue == signedValue) - variant->setInteger(truncatedValue, resources_); + if (truncatedValue == signedValue) { + if (!variant->setInteger(truncatedValue, resources_)) + return DeserializationError::NoMemory; + } // else set null on overflow } else { auto truncatedValue = static_cast(unsignedValue); if (truncatedValue == unsignedValue) - variant->setInteger(truncatedValue, resources_); + if (!variant->setInteger(truncatedValue, resources_)) + return DeserializationError::NoMemory; // else set null on overflow } @@ -270,9 +273,10 @@ class MsgPackDeserializer { return err; fixEndianness(value); - variant->setFloat(value, resources_); - - return DeserializationError::Ok; + if (variant->setFloat(value, resources_)) + return DeserializationError::Ok; + else + return DeserializationError::NoMemory; } template