Skip to content

Commit c45afbe

Browse files
committed
Improve freeing memory
1 parent cb2bbb3 commit c45afbe

File tree

1 file changed

+24
-32
lines changed

1 file changed

+24
-32
lines changed

c_src/ex_dtls/native.c

Lines changed: 24 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ UNIFEX_TERM handle_read_error(State *state, int ret);
2727
UNIFEX_TERM handle_handshake_in_progress(State *state, int ret);
2828
UNIFEX_TERM handle_handshake_finished(State *state);
2929
static UnifexPayload **to_payload_array(struct Datagram *dgram_list, int len);
30+
static void free_payload_array(UnifexPayload **payloads, int len);
3031

3132
int handle_load(UnifexEnv *env, void **priv_data) {
3233
UNIFEX_UNUSED(env);
@@ -258,9 +259,8 @@ UNIFEX_TERM do_handshake(UnifexEnv *env, State *state) {
258259
int timeout = get_timeout(state->ssl);
259260
UNIFEX_TERM res_term =
260261
do_handshake_result(env, gen_packets, gen_packets_size, timeout);
261-
for (int i = 0; i < gen_packets_size; i++) {
262-
unifex_payload_release(gen_packets[i]);
263-
}
262+
free_payload_array(gen_packets, gen_packets_size);
263+
264264
return res_term;
265265
}
266266
}
@@ -298,9 +298,7 @@ UNIFEX_TERM write_data(UnifexEnv *env, State *state, UnifexPayload *payload) {
298298
UNIFEX_TERM res_term =
299299
write_data_result_ok(env, gen_packets, gen_packets_size);
300300

301-
for (int i = 0; i < gen_packets_size; i++) {
302-
unifex_payload_release(gen_packets[i]);
303-
}
301+
free_payload_array(gen_packets, gen_packets_size);
304302

305303
return res_term;
306304
}
@@ -338,13 +336,12 @@ UNIFEX_TERM handle_data(UnifexEnv *env, State *state, UnifexPayload *payload) {
338336
UNIFEX_TERM handle_regular_read(State *state, char data[], int ret) {
339337
if (ret > 0) {
340338
UnifexPayload **packets = calloc(1, sizeof(UnifexPayload *));
341-
UnifexPayload packet;
342-
packets[0] = &packet;
339+
packets[0] = calloc(1, sizeof(UnifexPayload));
343340
unifex_payload_alloc(state->env, UNIFEX_PAYLOAD_BINARY, ret, packets[0]);
344341
memcpy(packets[0]->data, data, ret);
345342
packets[0]->size = (unsigned int)ret;
346343
UNIFEX_TERM res_term = handle_data_result_ok(state->env, packets, 1);
347-
unifex_payload_release(packets[0]);
344+
free_payload_array(packets, 1);
348345
return res_term;
349346
}
350347

@@ -426,9 +423,7 @@ UNIFEX_TERM handle_handshake_finished(State *state) {
426423

427424
cleanup:
428425

429-
for (int i = 0; i < gen_packets_size; i++) {
430-
unifex_payload_release(gen_packets[i]);
431-
}
426+
free_payload_array(gen_packets, gen_packets_size);
432427

433428
unifex_payload_release(&client_keying_material);
434429
unifex_payload_release(&server_keying_material);
@@ -454,9 +449,7 @@ UNIFEX_TERM handle_handshake_in_progress(State *state, int ret) {
454449
UNIFEX_TERM res_term = handle_data_result_handshake_packets(
455450
state->env, gen_packets, gen_packets_size, timeout);
456451

457-
for (int i = 0; i < gen_packets_size; i++) {
458-
unifex_payload_release(gen_packets[i]);
459-
}
452+
free_payload_array(gen_packets, gen_packets_size);
460453

461454
return res_term;
462455
} else {
@@ -483,11 +476,7 @@ UNIFEX_TERM handle_timeout(UnifexEnv *env, State *state) {
483476
int timeout = get_timeout(state->ssl);
484477
UNIFEX_TERM res_term = handle_timeout_result_retransmit(
485478
env, gen_packets, gen_packets_size, timeout);
486-
487-
for (int i = 0; i < gen_packets_size; i++) {
488-
unifex_payload_release(gen_packets[i]);
489-
}
490-
479+
free_payload_array(gen_packets, gen_packets_size);
491480
return res_term;
492481
}
493482
}
@@ -539,28 +528,23 @@ static UnifexPayload **to_payload_array(struct Datagram *dgram_list, int len) {
539528
struct Datagram *itr = dgram_list;
540529

541530
for (int i = 0; i < len; i++) {
542-
DEBUG("size, %d", itr->packet->size);
543531
itr = itr->next;
544532
}
545533

546534
itr = dgram_list;
547535
for (int i = 0; i < len; i++) {
548-
DEBUG("to payload array 3, %d", len);
549536
payloads[i] = itr->packet;
550537
itr = itr->next;
551538
}
552539

553-
DEBUG("to payload array");
554-
555-
// itr = dgram_list;
556-
// struct Datagram *next = dgram_list->next;
540+
itr = dgram_list;
541+
struct Datagram *next = dgram_list->next;
557542

558-
// for (int i = 0; i < len; i++) {
559-
// free(itr);
560-
// itr = next;
561-
// next = itr->next;
562-
// DEBUG("dupa2");
563-
// }
543+
while (next != NULL) {
544+
free(itr);
545+
itr = next;
546+
next = itr->next;
547+
}
564548

565549
return payloads;
566550
}
@@ -625,6 +609,14 @@ static void pkey_to_payload(UnifexEnv *env, EVP_PKEY *pkey,
625609
payload->size = len;
626610
}
627611

612+
static void free_payload_array(UnifexPayload **payloads, int len) {
613+
for (int i = 0; i < len; i++) {
614+
unifex_payload_release(payloads[i]);
615+
free(payloads[i]);
616+
}
617+
free(payloads);
618+
}
619+
628620
void handle_destroy_state(UnifexEnv *env, State *state) {
629621
UNIFEX_UNUSED(env);
630622
DEBUG("Destroying state");

0 commit comments

Comments
 (0)