Greetings All,
I am still digging into this trying to access the impact, but I believe it is
significant enough of a problem, especially given the pending 1.3 release, to
bring it up at this point. This message might be a bit long, but it is
important I think:
As pointed out by Alex Kelly, the following macro, is defined in ocpayload.h
#define VERIFY_CBOR_SUCCESS(log_tag, err, log_message) \
if ((CborNoError != (err)) && (CborErrorOutOfMemory != (err))) \
{ \
if ((log_tag) && (log_message)) \
{ \
OIC_LOG_V(ERROR, (log_tag), "%s with cbor error: \'%s\'.", \
(log_message), (cbor_error_string(err))); \
} \
goto exit; \
} \
Notice that CborErrorOutOfMemory is not considered an error condition. Looks
like this was written with the intent to follow that with an out of memory
check,
VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed adding roles name tag");
VERIFY_CBOR_NOT_OUTOFMEMORY(TAG, cborEncoderResult, "Not enough memory for
roles name tag")
However, there is only one function in all of IoTivity that actually does that
subsequent memory check. Of the about 800 locations where VERIFY_CBOR_SUCCESS
is used, only about 40 are followed by VERIFY_CBOR_NOT_OUTOFMEMORY, which means
in about 760 places in the code, out of memory is not being detected or
responded to. Seems like a pretty big deal.
Next I created this macro,
#define VERIFY_CBOR_NO_ERROR(log_tag, err, log_message) \
if ( CborNoError != (err) ) \
{ \
if ((log_tag) && (log_message)) \
{ \
OIC_LOG_V(ERROR, (log_tag), "%s with cbor error: \'%s\'.", \
(log_message), (cbor_error_string(err))); \
} \
if (CborErrorOutOfMemory == (err)) \
{ \
OIC_LOG_V(ERROR, "CBOR_NO_MEM", "Ran out of memery at
file/func/line: %s, %s, %d", \
__FILE__, __func__, __LINE__ ); \
} \
goto exit; \
} \
… which does not bypass CborErrorOutOfMemory, and reports when an out of memory
condition is encountered. I then used this macro, instead of the original, for
all ~760 instances that code is not checking for out of memory error.
Then, after that I started running unit tests to see what the impact of
actually detecting out of memory conditions would be. It has been kind of slow
going, but so far I have found that rdtests hits the out of memory condition
about 2 million times (literally), at these locations
resource/csdk/stack/src/ocpayloadconvert.c, OCConvertArray, 808
resource/csdk/stack/src/ocpayloadconvert.c, OCConvertRepMap, 844
resource/csdk/stack/src/ocpayloadconvert.c, OCConvertRepPayload, 969
resource/csdk/stack/src/ocpayloadconvert.c, OCConvertSingleRepPayload, 931
resource/csdk/stack/src/ocpayloadconvert.c, OCConvertSingleRepPayload, 934
I am now running resource/unittest (it is taking forever), but it is hitting
the out of memory error lots more than rdtests
So, the code as it currently stands essentially has no protection against CBOR
memory exhaustion in about about 80% of the encoding cases, and we are hitting
that conditions quite frequently in some of the unit tests.
Is this a release stopper?
Kind Regards
Steve
CableLabs
PS: If you want to follow the entire conversation you can see it here:
https://jira.iotivity.org/browse/IOT-2728
_______________________________________________
iotivity-dev mailing list
[email protected]
https://lists.iotivity.org/mailman/listinfo/iotivity-dev