From 0cba4f7aa5a81d0fa74644258a8765b1c6a00481 Mon Sep 17 00:00:00 2001 From: sedeno Date: Thu, 13 Feb 2020 14:18:50 +0100 Subject: [PATCH] Do not try to allocate memory on de-serialization when there is no need to do so. --- src/lib/support/SerializationUtils.cpp | 33 ++++++++++++++++---------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/lib/support/SerializationUtils.cpp b/src/lib/support/SerializationUtils.cpp index 77607453dd..6e1822fe84 100644 --- a/src/lib/support/SerializationUtils.cpp +++ b/src/lib/support/SerializationUtils.cpp @@ -877,18 +877,23 @@ WEAVE_ERROR ReadDataForType(TLVReader &aReader, void *aStructureData, const Fiel case SerializedFieldTypeUTF8String: { - char *dst = NULL; // TLV Strings are not null terminated uint32_t length = aReader.GetLength() + 1; - dst = (char *)memMgmt->mem_alloc(length); - VerifyOrExit(dst != NULL, err = WEAVE_ERROR_NO_MEMORY); + if (length > 1) + { + char *dst = NULL; - err = aReader.GetString(dst, length); - SuccessOrExit(err); + dst = (char *)memMgmt->mem_alloc(length); + VerifyOrExit(dst != NULL, err = WEAVE_ERROR_NO_MEMORY); + + err = aReader.GetString(dst, length); + SuccessOrExit(err); + + LogReadWrite("%s utf8string '%s' allocating %d bytes at %p", "R", dst, length, dst); - LogReadWrite("%s utf8string '%s' allocating %d bytes at %p", "R", dst, length, dst); - *static_cast(aStructureData) = dst; + *static_cast(aStructureData) = dst; + } break; } @@ -897,12 +902,16 @@ WEAVE_ERROR ReadDataForType(TLVReader &aReader, void *aStructureData, const Fiel SerializedByteString byteString; byteString.mLen = aReader.GetLength(); - byteString.mBuf = static_cast(memMgmt->mem_alloc(byteString.mLen)); - VerifyOrExit(byteString.mBuf != NULL, err = WEAVE_ERROR_NO_MEMORY); - aReader.GetBytes(byteString.mBuf, byteString.mLen); + if (byteString.mLen > 0) + { + byteString.mBuf = static_cast(memMgmt->mem_alloc(byteString.mLen)); + VerifyOrExit(byteString.mBuf != NULL, err = WEAVE_ERROR_NO_MEMORY); + aReader.GetBytes(byteString.mBuf, byteString.mLen); + + LogReadWrite("%s bytestring allocated %d bytes at %p", "R", byteString.mLen, byteString.mBuf); - LogReadWrite("%s bytestring allocated %d bytes at %p", "R", byteString.mLen, byteString.mBuf); - *static_cast(aStructureData) = byteString; + *static_cast(aStructureData) = byteString; + } break; }