Skip to content

Commit 2ec9b6e

Browse files
author
Tero Heinonen
authored
Fix memory leak if dhcp renew send fails (ARMmbed#1858)
If dhcp_service_send_req() returns failure during renew, previously allocated payload was not freed. Added check for return value and free for payload if request sending is failed.
1 parent cbf99e7 commit 2ec9b6e

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

source/6LoWPAN/Thread/thread_dhcpv6_client.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ void thread_dhcpv6_renew(protocol_interface_info_entry_t *interface, if_address_
284284
payload_len = libdhcpv6_address_request_message_len(srv_data_ptr->clientLinkIdType, srv_data_ptr->serverLinkType, 0);
285285
payload_ptr = ns_dyn_mem_temporary_alloc(payload_len);
286286
if (payload_ptr == NULL) {
287-
addr->state_timer = 200;//Retry after? should there be maximum 20 second retry
287+
addr->state_timer = 200; //Retry after 20 seconds
288288
tr_error("Out of memory");
289289
return ;
290290
}
@@ -308,6 +308,11 @@ void thread_dhcpv6_renew(protocol_interface_info_entry_t *interface, if_address_
308308
libdhcpv6_generic_nontemporal_address_message_write(payload_ptr, &packetReq, &nonTemporalAddress, &serverLink);
309309
// send solicit
310310
srv_data_ptr->transActionId = dhcp_service_send_req(dhcp_client.service_instance, 0, srv_data_ptr, srv_data_ptr->server_address, payload_ptr, payload_len, dhcp_solicit_resp_cb);
311+
if (srv_data_ptr->transActionId == 0) {
312+
ns_dyn_mem_free(payload_ptr);
313+
addr->state_timer = 200; //Retry after 20 seconds
314+
tr_error("DHCP renew send failed");
315+
}
311316
}
312317

313318
void thread_dhcpv6_client_set_address(int8_t interface_id, dhcpv6_client_server_data_t *srv_data_ptr)

0 commit comments

Comments
 (0)