Fix memory leak when creating a sprinkler.
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
NADAL Jean-Baptiste
2020-01-07 14:00:17 +01:00
parent 35f5319fa9
commit 87751f24b7
2 changed files with 47 additions and 32 deletions

View File

@@ -92,6 +92,9 @@ devices_manager_t *devices_manager_new(void)
void devices_manager_free(devices_manager_t *devices_manager) void devices_manager_free(devices_manager_t *devices_manager)
{ {
qlist_obj_t obj;
int i;
if (devices_manager == NULL) if (devices_manager == NULL)
return; return;
@@ -105,7 +108,15 @@ void devices_manager_free(devices_manager_t *devices_manager)
} }
if (devices_manager->sprinklers) if (devices_manager->sprinklers)
{ {
devices_manager->sprinklers->free(devices_manager->sprinklers); memset((void *)&obj, 0, sizeof(obj));
i = 0;
while (qlist_getnext(devices_manager->sprinklers, &obj, true))
{
sprinkler_free(obj.data);
i++;
}
qlist_free(devices_manager->sprinklers);
} }
if (devices_manager->file_path != NULL) if (devices_manager->file_path != NULL)
@@ -211,47 +222,47 @@ int devices_manager_set(devices_manager_t *dm, const char *capability, struct js
int devices_manager_set_state(devices_manager_t *dm, const char *capability, int id, bool state) int devices_manager_set_state(devices_manager_t *dm, const char *capability, int id, bool state)
{ {
int result = -1; int result = -1;
if (capability == kOutletEntry) if (capability == kOutletEntry)
{ {
result = set_outlet_state(dm, id, state); result = set_outlet_state(dm, id, state);
} }
else if (capability == kShutterEntry) else if (capability == kShutterEntry)
{ {
result = set_shutter_state(dm, id, state); result = set_shutter_state(dm, id, state);
} }
else if (capability == kSprinklerEntry) else if (capability == kSprinklerEntry)
{ {
result = set_sprinkler_state(dm, id, state); result = set_sprinkler_state(dm, id, state);
} }
if (result == 0) if (result == 0)
{ {
devices_manager_save(dm); devices_manager_save(dm);
} }
return result; return result;
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
int devices_manager_create(devices_manager_t *dm, const char *capability, struct json_object *node) int devices_manager_create(devices_manager_t *dm, const char *capability, struct json_object *node)
{ {
if (capability == kOutletEntry) if (capability == kOutletEntry)
{ {
return create_outlet(dm, node); return create_outlet(dm, node);
} }
else if (capability == kShutterEntry) else if (capability == kShutterEntry)
{ {
return create_shutter(dm, node); return create_shutter(dm, node);
} }
else if (capability == kSprinklerEntry) else if (capability == kSprinklerEntry)
{ {
return create_sprinkler(dm, node); return create_sprinkler(dm, node);
} }
return -1; return -1;
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
@@ -562,6 +573,7 @@ int create_sprinkler(devices_manager_t *dm, struct json_object *node)
device_set_id(sprinkler->device, ++dm->sprinklers_max_id); device_set_id(sprinkler->device, ++dm->sprinklers_max_id);
qlist_addlast(dm->sprinklers, sprinkler, sizeof(sprinkler_t)); qlist_addlast(dm->sprinklers, sprinkler, sizeof(sprinkler_t));
free(sprinkler); // duplicated by qlist
return 0; return 0;
} }

View File

@@ -61,6 +61,9 @@ TEST("sprinkler - create set_state remove.")
ret = devices_manager_create(dm, kSprinklerEntry, root_node); ret = devices_manager_create(dm, kSprinklerEntry, root_node);
ASSERT_EQUAL_INT(ret, 0); ASSERT_EQUAL_INT(ret, 0);
// ret = set_sprinkler_state(dm, 1, true);
// ASSERT_EQUAL_INT(ret, 0);
/* Clean the json object. */ /* Clean the json object. */
json_object_put(root_node); json_object_put(root_node);