forked from bblanchon/ArduinoJson
MsgPackDeserializer: check extension allocation result
This commit is contained in:
@ -199,3 +199,44 @@ TEST_CASE(
|
|||||||
REQUIRE(err == DeserializationError::NoMemory);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -230,13 +230,16 @@ class MsgPackDeserializer {
|
|||||||
|
|
||||||
if (isSigned) {
|
if (isSigned) {
|
||||||
auto truncatedValue = static_cast<JsonInteger>(signedValue);
|
auto truncatedValue = static_cast<JsonInteger>(signedValue);
|
||||||
if (truncatedValue == signedValue)
|
if (truncatedValue == signedValue) {
|
||||||
variant->setInteger(truncatedValue, resources_);
|
if (!variant->setInteger(truncatedValue, resources_))
|
||||||
|
return DeserializationError::NoMemory;
|
||||||
|
}
|
||||||
// else set null on overflow
|
// else set null on overflow
|
||||||
} else {
|
} else {
|
||||||
auto truncatedValue = static_cast<JsonUInt>(unsignedValue);
|
auto truncatedValue = static_cast<JsonUInt>(unsignedValue);
|
||||||
if (truncatedValue == unsignedValue)
|
if (truncatedValue == unsignedValue)
|
||||||
variant->setInteger(truncatedValue, resources_);
|
if (!variant->setInteger(truncatedValue, resources_))
|
||||||
|
return DeserializationError::NoMemory;
|
||||||
// else set null on overflow
|
// else set null on overflow
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -270,9 +273,10 @@ class MsgPackDeserializer {
|
|||||||
return err;
|
return err;
|
||||||
|
|
||||||
fixEndianness(value);
|
fixEndianness(value);
|
||||||
variant->setFloat(value, resources_);
|
if (variant->setFloat(value, resources_))
|
||||||
|
return DeserializationError::Ok;
|
||||||
return DeserializationError::Ok;
|
else
|
||||||
|
return DeserializationError::NoMemory;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
Reference in New Issue
Block a user