Fix memory leak for provisioning 61/122561/1
authorJooseok Park <jooseok.park@samsung.com>
Mon, 3 Apr 2017 04:12:24 +0000 (13:12 +0900)
committerJooseok Park <jooseok.park@samsung.com>
Mon, 3 Apr 2017 04:12:24 +0000 (13:12 +0900)
 - In case of resource uri failure, resource leak occurs.
 - So, need to do uri check before memory allocation for resource

resource uri check logic will be done before do calloc() for resource

Change-Id: I0d3e9b81f0f977389382e1352bb9458a9d92b3f6

src/ic-provisioning.c

index acd37b0..0081d7d 100644 (file)
@@ -547,26 +547,27 @@ static OicSecAcl_t* _provisioning_convert_acl(iotcon_provisioning_device_h devic
        num_of_resources = icl_provisioning_acl_get_resource_count(acl);
 
        for (i = 0; i < num_of_resources; i++) {
-               resource = calloc(1, sizeof(OicSecRsrc_t));
-               if (NULL == resource) {
-                       ERR("calloc() Fail(%d)", errno);
+               uri_path = icl_provisioning_acl_get_nth_resource(acl, i);
+               if (NULL == uri_path) {
+                       ERR("icl_provisioning_acl_get_nth_resource() Fail(%d)", errno);
                        OCDeleteACLList(oic_acl);
                        return NULL;
                }
 
-               uri_path = icl_provisioning_acl_get_nth_resource(acl, i);
-               if (NULL == uri_path) {
-                       ERR("icl_provisioning_acl_get_nth_resource() Fail(%d)", errno);
-                       free(resource);
+               resource = calloc(1, sizeof(OicSecRsrc_t));
+               if (NULL == resource) {
+                       ERR("calloc() Fail(%d)", errno);
                        OCDeleteACLList(oic_acl);
                        return NULL;
                }
+
                resource->href = ic_utils_strdup(uri_path);
 
                /* TODO: resource types & resource interfaces */
                resource->types = calloc(1, sizeof(char*));
                if (NULL == resource->types) {
                        ERR("calloc() Fail(%d)", errno);
+                       free(resource->href);
                        free(resource);
                        OCDeleteACLList(oic_acl);
                        return NULL;
@@ -577,6 +578,7 @@ static OicSecAcl_t* _provisioning_convert_acl(iotcon_provisioning_device_h devic
                resource->interfaces = calloc(1, sizeof(char*));
                if (NULL == resource->interfaces) {
                        ERR("calloc() Fail(%d)", errno);
+                       free(resource->href);
                        free(resource->types[0]);
                        free(resource->types);
                        free(resource);