Fix memory leak in transportEndpointsPayload 49/23849/3
authorMats Wichmann <mats@linux.com>
Sat, 30 Dec 2017 18:34:13 +0000 (11:34 -0700)
committerMats Wichmann <mats@linux.com>
Wed, 7 Feb 2018 16:04:21 +0000 (16:04 +0000)
The internal function transportEndpointsPayload in occollection.c
creates endpoint strings and copies them into a payload.
However, the memory holding the generated string allocated by
OCCreateEndpointString is not freed after the payload copy is
made, and each time through the loop the pointer that refers to
this memory, createdEPStr, goes out of scope so the memory leaks.

valgrind of the stack unittests detected this with the
following leak report:

  264 bytes in 4 blocks are definitely lost in loss record 937 of 988

If traced back, this is triggered in the test for
BuildCollectionLinksPayloadArray, where inside a loop, the
function is called twice;

    linksRepPayloadArray = BuildCollectionLinksPayloadArray("/a/kitchen", false,
    devAddr, false, &arraySize);

    linksRepPayloadArray = BuildCollectionLinksPayloadArray("/a/kitchen", true, devAddr, false,
         &arraySize);

BuildCollectionLinksPayloadArray (not public API) calls
translateEndpointsPayload as described above.

Fix: add OICFree to the stanza where an endpoint string is created
and added with OCRepPayloadSetPropString.

Bug: https://jira.iotivity.org/browse/IOT-2951
Change-Id: Ie1fcbf6dc01479f01134bdb0ace09fa974df80c8
Signed-off-by: Mats Wichmann <mats@linux.com>
resource/csdk/stack/src/occollection.c

index d683fc8..0a512f1 100644 (file)
@@ -429,6 +429,7 @@ static bool translateEndpointsPayload(OCEndpointPayload* epPayloadOrg,
         char* createdEPStr = OCCreateEndpointString(epPayload);
         OIC_LOG_V(DEBUG, TAG, " OCCreateEndpointString() = %s", createdEPStr);
         OCRepPayloadSetPropString(arrayPayload[i], OC_RSRVD_ENDPOINT, createdEPStr);
+        OICFree(createdEPStr);
 
         // in case of pri as 1, skip set property
         if (epPayload->pri != 1 )