From 2a777a659a4ac0f24233003c3243084af32f2fb9 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Thu, 15 Apr 2021 11:48:30 +0200 Subject: [PATCH] Fixed reference-binding-to-null-pointer in MsgPack deserializer --- .../MsgPack/MsgPackDeserializer.hpp | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp b/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp index 7ef0a632..49c6fd41 100644 --- a/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp +++ b/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp @@ -27,7 +27,7 @@ class MsgPackDeserializer { template DeserializationError parse(VariantData &variant, TFilter filter, NestingLimit nestingLimit) { - parseVariant(variant, filter, nestingLimit); + parseVariant(&variant, filter, nestingLimit); return _foundSomething ? _error : DeserializationError::EmptyInput; } @@ -41,7 +41,7 @@ class MsgPackDeserializer { } template - bool parseVariant(VariantData &variant, TFilter filter, + bool parseVariant(VariantData *variant, TFilter filter, NestingLimit nestingLimit) { uint8_t code = 0; // TODO: why do we need to initialize this variable? if (!readByte(code)) @@ -61,12 +61,12 @@ class MsgPackDeserializer { case 0xc2: if (allowValue) - variant.setBoolean(false); + variant->setBoolean(false); return true; case 0xc3: if (allowValue) - variant.setBoolean(true); + variant->setBoolean(true); return true; case 0xc4: // bin 8 (not supported) @@ -217,7 +217,7 @@ class MsgPackDeserializer { } if (allowValue) - variant.setInteger(static_cast(code)); + variant->setInteger(static_cast(code)); return true; } @@ -263,39 +263,39 @@ class MsgPackDeserializer { } template - bool readInteger(VariantData &variant) { + bool readInteger(VariantData *variant) { T value; if (!readInteger(value)) return false; - variant.setInteger(value); + variant->setInteger(value); return true; } template typename enable_if::type readFloat( - VariantData &variant) { + VariantData *variant) { T value; if (!readBytes(value)) return false; fixEndianess(value); - variant.setFloat(value); + variant->setFloat(value); return true; } template typename enable_if::type readDouble( - VariantData &variant) { + VariantData *variant) { T value; if (!readBytes(value)) return false; fixEndianess(value); - variant.setFloat(value); + variant->setFloat(value); return true; } template typename enable_if::type readDouble( - VariantData &variant) { + VariantData *variant) { uint8_t i[8]; // input is 8 bytes T value; // output is 4 bytes uint8_t *o = reinterpret_cast(&value); @@ -303,12 +303,12 @@ class MsgPackDeserializer { return false; doubleToFloat(i, o); fixEndianess(value); - variant.setFloat(value); + variant->setFloat(value); return true; } template - bool readString(VariantData &variant) { + bool readString(VariantData *variant) { T size; if (!readInteger(size)) return false; @@ -331,11 +331,11 @@ class MsgPackDeserializer { return skipBytes(size); } - bool readString(VariantData &variant, size_t n) { + bool readString(VariantData *variant, size_t n) { if (!readString(n)) return false; - variant.setStringPointer(_stringStorage.save(), - typename TStringStorage::storage_policy()); + variant->setStringPointer(_stringStorage.save(), + typename TStringStorage::storage_policy()); return true; } @@ -357,7 +357,7 @@ class MsgPackDeserializer { } template - bool readArray(VariantData &variant, TFilter filter, + bool readArray(VariantData *variant, TFilter filter, NestingLimit nestingLimit) { TSize size; if (!readInteger(size)) @@ -366,7 +366,7 @@ class MsgPackDeserializer { } template - bool readArray(VariantData &variant, size_t n, TFilter filter, + bool readArray(VariantData *variant, size_t n, TFilter filter, NestingLimit nestingLimit) { if (nestingLimit.reached()) { _error = DeserializationError::TooDeep; @@ -375,7 +375,7 @@ class MsgPackDeserializer { bool allowArray = filter.allowArray(); - CollectionData *array = allowArray ? &variant.toArray() : 0; + CollectionData *array = allowArray ? &variant->toArray() : 0; TFilter memberFilter = filter[0U]; @@ -392,7 +392,7 @@ class MsgPackDeserializer { value = 0; } - if (!parseVariant(*value, memberFilter, nestingLimit.decrement())) + if (!parseVariant(value, memberFilter, nestingLimit.decrement())) return false; } @@ -400,7 +400,7 @@ class MsgPackDeserializer { } template - bool readObject(VariantData &variant, TFilter filter, + bool readObject(VariantData *variant, TFilter filter, NestingLimit nestingLimit) { TSize size; if (!readInteger(size)) @@ -409,14 +409,14 @@ class MsgPackDeserializer { } template - bool readObject(VariantData &variant, size_t n, TFilter filter, + bool readObject(VariantData *variant, size_t n, TFilter filter, NestingLimit nestingLimit) { if (nestingLimit.reached()) { _error = DeserializationError::TooDeep; return false; } - CollectionData *object = filter.allowObject() ? &variant.toObject() : 0; + CollectionData *object = filter.allowObject() ? &variant->toObject() : 0; for (; n; --n) { if (!readKey()) @@ -444,7 +444,7 @@ class MsgPackDeserializer { member = 0; } - if (!parseVariant(*member, memberFilter, nestingLimit.decrement())) + if (!parseVariant(member, memberFilter, nestingLimit.decrement())) return false; }