Fix issues dealing with OOM checking in CBOR 03/24003/3
authorThiago Macieira <thiago.macieira@intel.com>
Fri, 26 Jan 2018 07:44:37 +0000 (23:44 -0800)
committerPhil Coval <philippe.coval@osg.samsung.com>
Tue, 6 Feb 2018 11:34:29 +0000 (11:34 +0000)
Since we're doing err |=, the correct way to check for OOM is with &.

TinyCBOR 0.5 is capable of reporting if you added too many or too few
elements to a container. So don't skip adding one: always add them all,
so we can get the actual size you need.

Change-Id: I56b444f9d6274221a3b7fffd150d4c8e2cb6618a
Signed-off-by: Thiago Macieira <thiago.macieira@intel.com>
resource/csdk/stack/include/ocpayload.h
resource/csdk/stack/src/ocpayloadconvert.c

index 1963fcb..b65ccfd 100644 (file)
@@ -46,7 +46,7 @@ extern "C"
  * Macro to verify the validity of cbor operation.
  */
 #define VERIFY_CBOR_SUCCESS_OR_OUT_OF_MEMORY(log_tag, err, log_message) \
-    if ((CborNoError != (err)) && (CborErrorOutOfMemory != (err))) \
+    if ((CborNoError != (err)) && !(CborErrorOutOfMemory & (err))) \
     { \
         if ((log_tag) && (log_message)) \
         { \
@@ -64,7 +64,7 @@ extern "C"
     } \
 
 #define VERIFY_CBOR_NOT_OUTOFMEMORY(log_tag, err, log_message) \
-    if (CborErrorOutOfMemory == (err)) \
+    if (CborErrorOutOfMemory & (err)) \
     { \
         if ((log_tag) && (log_message)) \
         { \
index 6a8d5b1..f29daa1 100644 (file)
@@ -114,7 +114,7 @@ OCStackResult OCConvertPayload(OCPayload* payload, OCPayloadFormat format,
         VERIFY_PARAM_NON_NULL(TAG, out, "Failed to allocate payload");
         err = OCConvertPayloadHelper(payload, format, out, &curSize);
 
-        if (CborErrorOutOfMemory != err)
+        if ((CborErrorOutOfMemory & err) == 0)
         {
             break;
         }
@@ -175,7 +175,7 @@ static int64_t OCConvertPayloadHelper(OCPayload* payload, OCPayloadFormat format
 
 static int64_t checkError(int64_t err, CborEncoder* encoder, uint8_t* outPayload, size_t* size)
 {
-    if (err == CborErrorOutOfMemory)
+    if (err & CborErrorOutOfMemory)
     {
         *size += cbor_encoder_get_extra_bytes_needed(encoder);
         return err;
@@ -1053,7 +1053,7 @@ static int64_t AddTextStringToMap(CborEncoder* map, const char* key, size_t keyl
         return CborErrorInvalidUtf8TextString;
     }
     int64_t err = cbor_encode_text_string(map, key, keylen);
-    if (CborNoError != err)
+    if (CborNoError != err && CborErrorOutOfMemory != err)
     {
         return err;
     }