@@ -27,6 +27,7 @@ UNIFEX_TERM handle_read_error(State *state, int ret);
2727UNIFEX_TERM handle_handshake_in_progress (State * state , int ret );
2828UNIFEX_TERM handle_handshake_finished (State * state );
2929static UnifexPayload * * to_payload_array (struct Datagram * dgram_list , int len );
30+ static void free_payload_array (UnifexPayload * * payloads , int len );
3031
3132int 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) {
338336UNIFEX_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
427424cleanup :
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+
628620void handle_destroy_state (UnifexEnv * env , State * state ) {
629621 UNIFEX_UNUSED (env );
630622 DEBUG ("Destroying state" );
0 commit comments