From 87751f24b7a4efc2f4aa706b33ce2ecdd284e313 Mon Sep 17 00:00:00 2001 From: NADAL Jean-Baptiste Date: Tue, 7 Jan 2020 14:00:17 +0100 Subject: [PATCH] Fix memory leak when creating a sprinkler. --- src/devices/devices_manager.c | 76 ++++++++++++++++++++--------------- src/tests/test_device.c | 3 ++ 2 files changed, 47 insertions(+), 32 deletions(-) diff --git a/src/devices/devices_manager.c b/src/devices/devices_manager.c index ec70257..be7c849 100644 --- a/src/devices/devices_manager.c +++ b/src/devices/devices_manager.c @@ -92,6 +92,9 @@ devices_manager_t *devices_manager_new(void) void devices_manager_free(devices_manager_t *devices_manager) { + qlist_obj_t obj; + int i; + if (devices_manager == NULL) return; @@ -105,7 +108,15 @@ void devices_manager_free(devices_manager_t *devices_manager) } 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) @@ -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 result = -1; + int result = -1; - if (capability == kOutletEntry) - { - result = set_outlet_state(dm, id, state); - } - else if (capability == kShutterEntry) - { - result = set_shutter_state(dm, id, state); - } - else if (capability == kSprinklerEntry) - { - result = set_sprinkler_state(dm, id, state); - } + if (capability == kOutletEntry) + { + result = set_outlet_state(dm, id, state); + } + else if (capability == kShutterEntry) + { + result = set_shutter_state(dm, id, state); + } + else if (capability == kSprinklerEntry) + { + result = set_sprinkler_state(dm, id, state); + } - if (result == 0) - { - devices_manager_save(dm); - } + if (result == 0) + { + devices_manager_save(dm); + } - return result; + return result; } /*--------------------------------------------------------------------------*/ int devices_manager_create(devices_manager_t *dm, const char *capability, struct json_object *node) { - if (capability == kOutletEntry) - { - return create_outlet(dm, node); - } - else if (capability == kShutterEntry) - { - return create_shutter(dm, node); - } - else if (capability == kSprinklerEntry) - { - return create_sprinkler(dm, node); - } + if (capability == kOutletEntry) + { + return create_outlet(dm, node); + } + else if (capability == kShutterEntry) + { + return create_shutter(dm, node); + } + else if (capability == kSprinklerEntry) + { + 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); qlist_addlast(dm->sprinklers, sprinkler, sizeof(sprinkler_t)); + free(sprinkler); // duplicated by qlist return 0; } diff --git a/src/tests/test_device.c b/src/tests/test_device.c index d1ed2e3..d3e4fdb 100644 --- a/src/tests/test_device.c +++ b/src/tests/test_device.c @@ -61,6 +61,9 @@ TEST("sprinkler - create set_state remove.") ret = devices_manager_create(dm, kSprinklerEntry, root_node); ASSERT_EQUAL_INT(ret, 0); + // ret = set_sprinkler_state(dm, 1, true); + // ASSERT_EQUAL_INT(ret, 0); + /* Clean the json object. */ json_object_put(root_node);