fix: leaks
This commit is contained in:
parent
ae119df026
commit
a2dfcebf3f
7 changed files with 92 additions and 37 deletions
|
@ -9,13 +9,13 @@ using namespace api::v1;
|
|||
|
||||
void devices::post_discover(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
|
||||
{
|
||||
auto resp = HttpResponse::newHttpResponse();
|
||||
|
||||
int discover_server_socket = helpers::bind_tcp_server("0.0.0.0", "0", config::discover_max_client_backlog);
|
||||
int discover_server_port = helpers::get_server_port(discover_server_socket);
|
||||
|
||||
if(discover_server_port == -1)
|
||||
{
|
||||
auto resp = HttpResponse::newHttpResponse();
|
||||
resp->setStatusCode(k500InternalServerError);
|
||||
callback(resp);
|
||||
return;
|
||||
|
@ -28,6 +28,7 @@ void devices::post_discover(const HttpRequestPtr &req, std::function<void(const
|
|||
|
||||
if(helpers::send_udp_broadcast("255.255.255.255", config::discover_port_dev, Json::writeString(json_writer, payload).c_str()) < 0)
|
||||
{
|
||||
auto resp = HttpResponse::newHttpResponse();
|
||||
resp->setStatusCode(k500InternalServerError);
|
||||
callback(resp);
|
||||
return;
|
||||
|
@ -42,7 +43,7 @@ void devices::post_discover(const HttpRequestPtr &req, std::function<void(const
|
|||
uint8_t discover_answer_buf[1];
|
||||
uint8_t discover_header_buf[1];
|
||||
|
||||
device_dbo **all_devices = device_dbo::get_all();
|
||||
device_dbo **known_devices = device_dbo::get_all();
|
||||
|
||||
while(true)
|
||||
{
|
||||
|
@ -98,26 +99,28 @@ void devices::post_discover(const HttpRequestPtr &req, std::function<void(const
|
|||
|
||||
json_reader.parse(answer_payload, &answer_payload[payload_length], client_info, false);
|
||||
|
||||
free(answer_payload);
|
||||
|
||||
const char *discovered_id = client_info["id"].asCString();
|
||||
|
||||
bool found_discovered_in_list = false;
|
||||
|
||||
for(int i = 0; all_devices[i] != nullptr; i++)
|
||||
for(int i = 0; known_devices[i] != nullptr; i++)
|
||||
{
|
||||
if(!found_discovered_in_list)
|
||||
{
|
||||
if(strcmp(all_devices[i]->id, discovered_id) == 0)
|
||||
if(strcmp(known_devices[i]->id, discovered_id) == 0)
|
||||
{
|
||||
all_devices[i]->active = true;
|
||||
all_devices[i]->update();
|
||||
free(all_devices[i]);
|
||||
known_devices[i]->active = true;
|
||||
known_devices[i]->update();
|
||||
free(known_devices[i]);
|
||||
found_discovered_in_list = true;
|
||||
all_devices[i] = all_devices[i + 1];
|
||||
known_devices[i] = known_devices[i + 1];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
all_devices[i] = all_devices[i + 1];
|
||||
known_devices[i] = known_devices[i + 1];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -139,15 +142,27 @@ void devices::post_discover(const HttpRequestPtr &req, std::function<void(const
|
|||
close(client_fd);
|
||||
}
|
||||
}
|
||||
for(int i = 0; known_devices[i] != nullptr; i++)
|
||||
{
|
||||
known_devices[i]->active = false;
|
||||
known_devices[i]->update();
|
||||
LOG_DEBUG << "Lost: " << known_devices[i]->name;
|
||||
}
|
||||
device_dbo::free_list(known_devices);
|
||||
|
||||
device_dbo **all_devices = device_dbo::get_all();
|
||||
Json::Value all_devices_json(Json::arrayValue);
|
||||
|
||||
for(int i = 0; all_devices[i] != nullptr; i++)
|
||||
{
|
||||
all_devices[i]->active = false;
|
||||
all_devices[i]->update();
|
||||
LOG_DEBUG << "Lost: " << all_devices[i]->name;
|
||||
all_devices_json.append(all_devices[i]->to_json());
|
||||
}
|
||||
|
||||
close(discover_server_socket);
|
||||
auto resp = HttpResponse::newHttpJsonResponse(all_devices_json);
|
||||
|
||||
callback(resp);
|
||||
|
||||
device_dbo::free_list(all_devices);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -61,7 +61,7 @@ schedules::delete_one_by_id(const HttpRequestPtr &req, std::function<void(const
|
|||
|
||||
callback(resp);
|
||||
|
||||
free(schedule);
|
||||
delete schedule;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -88,11 +88,16 @@ schedules::post_new(const HttpRequestPtr &req, std::function<void(const HttpResp
|
|||
new_schedule.id[32] = '\0';
|
||||
new_schedule.periods = periods;
|
||||
|
||||
new_schedule.insert();
|
||||
|
||||
auto resp = HttpResponse::newHttpResponse();
|
||||
callback(resp);
|
||||
|
||||
delete periods;
|
||||
if(!new_schedule.insert())
|
||||
{
|
||||
auto resp = HttpResponse::newHttpResponse();
|
||||
resp->setStatusCode(k500InternalServerError);
|
||||
callback(resp);
|
||||
}
|
||||
else
|
||||
{
|
||||
auto resp = HttpResponse::newHttpJsonResponse(new_schedule.to_json());
|
||||
callback(resp);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue