Fix memory leak when creating a sprinkler.
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user