Skip to content

Commit 957c7fb

Browse files
Juha Heiskanenjuhhei01
authored andcommitted
Pana server and client update:
Fix a memory leak when session is removed and eap fragmentation or reassembly is running. Fix Pana server eap fragmentation re-trans bug. Added support to force eap fragmentation timeout, retry and start fail. Client stop authentication from Client hello state to pana failure. (cherry picked from commit af2d049b766789fba28d71c6a1875cfe08deb69d)
1 parent ae230e5 commit 957c7fb

File tree

5 files changed

+74
-10
lines changed

5 files changed

+74
-10
lines changed

source/Security/Common/sec_lib_definitions.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@ typedef struct pana_session_t {
317317
bool session_ready:1;
318318
bool key_warp:1;
319319
bool user_server:1;
320+
bool packet_delivered:1;
320321
/* Define Relay usage */
321322
uint8_t address_status;
322323
uint8_t session_relay_address[16];

source/Security/Common/security_lib.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -748,12 +748,12 @@ int8_t sec_suite_remove(sec_suite_t *cur) {
748748
return -1;
749749
}
750750

751-
if (cur->pana_session.pana_heap) {
752-
ns_dyn_mem_free(cur->pana_session.pana_heap);
753-
cur->pana_session.pana_heap = NULL;
754-
}
751+
pana_free_dynamic_ram(cur);
755752

756753
sec_suite_tls_free(cur, true);
754+
#ifdef ECC
755+
sec_ecc_state_free(cur);
756+
#endif
757757
ns_list_remove(&sec_suite_list, cur);
758758
ns_dyn_mem_free(cur);
759759
return 0;

source/Security/PANA/eap_protocol.c

Lines changed: 64 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,37 @@
4242

4343
const uint8_t EAP_ANYMOUS[9] = {'a', 'n', 'o', 'n', 'y', 'm', 'o', 'u', 's'};
4444

45+
static bool force_frag_last_retry = false;
46+
47+
static bool force_frag_start_fail = false;
48+
49+
static bool force_frag_timeout = false;
50+
51+
static void eap_seq_back_to_accept(sec_suite_t *suite)
52+
{
53+
if (suite->pana_session.eap_id_seq == 0) {
54+
suite->pana_session.eap_id_seq = 0xff;
55+
} else {
56+
suite->pana_session.eap_id_seq--;
57+
}
58+
}
59+
60+
void pana_eap_fragmetation_start_filter(bool state)
61+
{
62+
tr_debug("Set start state %u", state);
63+
force_frag_start_fail = state;
64+
}
65+
66+
void pana_eap_fragmetation_force_timeout(bool state)
67+
{
68+
force_frag_timeout = state;
69+
}
70+
71+
void pana_eap_fragmetation_force_retry(bool state)
72+
{
73+
force_frag_last_retry = state;
74+
}
75+
4576
static buffer_t *eap_common_headroom_get_to_buffer(buffer_t *buf, uint16_t header_size)
4677
{
4778
if ((buf = buffer_headroom(buf, header_size)) == 0) {
@@ -145,7 +176,7 @@ bool pana_eap_frag_re_tx(sec_suite_t *suite)
145176
buffer_data_length_set(f_buf, suite->pana_session.last_assy_size);
146177
goto success_push;
147178
}
148-
} else if (suite->pana_session.eap_frag_buf) {
179+
} else if (suite->pana_session.eap_frag_buf || suite->pana_session.packet_delivered) {
149180
f_buf = buffer_get(127);
150181
if (f_buf) {
151182

@@ -337,17 +368,24 @@ buffer_t *eap_up(buffer_t *buf, sec_suite_t *suite)
337368
if (suite->pana_session.eap_assy_buf) {
338369
tr_debug("Free Frag Buf");
339370
buffer_free(suite->pana_session.eap_assy_buf);
340-
suite->pana_session.eap_assy_buf = 0;
371+
suite->pana_session.eap_assy_buf = NULL;
341372
}
342373
suite->pana_session.assy_length = 0;
343374
suite->pana_session.assy_off_set = 0;
344375
suite->pana_session.last_assy_size = 0;
376+
suite->pana_session.packet_delivered = true;
377+
suite->retry_counter = 0;
345378
}
346379
}
347380
}
348381

349382
if ((eap_tls_header.eap_tls_flags & EAP_TLS_MORE_FRAGMENTS) == 0) {
350383
if (suite->pana_session.frag_length) {
384+
if (force_frag_last_retry || force_frag_timeout) {
385+
force_frag_last_retry = false;
386+
eap_seq_back_to_accept(suite);
387+
return buffer_free(buf);
388+
}
351389
buffer_t *t_buf = suite->pana_session.eap_frag_buf;
352390

353391
uint16_t check_len = suite->pana_session.frag_off_set;
@@ -462,8 +500,14 @@ buffer_t *eap_up(buffer_t *buf, sec_suite_t *suite)
462500
//Check did we have a already action
463501
if (suite->pana_session.frag_length == 0) {
464502

465-
buffer_t *f_buf = buffer_get(eap_tls_header.tls_length);
466-
tr_debug("First Fragment");
503+
buffer_t *f_buf = NULL;
504+
if (force_frag_start_fail) {
505+
tr_debug("Force to drop fragment");
506+
force_frag_start_fail = false;
507+
} else {
508+
tr_debug("First Fragment");
509+
f_buf = buffer_get(eap_tls_header.tls_length);
510+
}
467511
if (f_buf) {
468512
buffer_data_length_set(f_buf, eap_tls_header.tls_length);
469513
memcpy(buffer_data_pointer(f_buf), eap_tls_header.data_ptr, eap_tls_header.tls_frame_length);
@@ -532,4 +576,20 @@ buffer_t *eap_up(buffer_t *buf, sec_suite_t *suite)
532576
return buffer_free(buf);
533577
}
534578
}
579+
#else
580+
void pana_eap_fragmetation_start_filter(bool state)
581+
{
582+
(void) state;
583+
}
584+
585+
void pana_eap_fragmetation_force_timeout(bool state)
586+
{
587+
(void) state;
588+
}
589+
590+
void pana_eap_fragmetation_force_retry(bool state)
591+
{
592+
(void) state;
593+
}
594+
535595
#endif

source/Security/PANA/pana_client.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -657,9 +657,11 @@ static void pana_client_state_machine_func(sec_suite_t *suite)
657657

658658
switch (suite->state) {
659659
case TLS_KEY_CHANGE:
660-
case TLS_INIT:
661660
sec_lib_state_machine_trig(suite, TLS_ALERT_INTERNAL);
662661
break;
662+
case TLS_INIT: //Trig pana failure if not get any response from server
663+
sec_lib_state_machine_trig(suite, PANA_FAILURE);
664+
break;
663665

664666
default:
665667
pana_client_pana_error_handler(suite);

source/Security/PANA/pana_server.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -741,13 +741,14 @@ static void pana_server_state_machine_func(sec_suite_t *suite)
741741
#ifdef ECC
742742
if (sec_auth_re_check(suite)) {
743743
bool tx_start_OK = false;
744-
if (suite->pana_session.assy_length && suite->pana_session.frag_length) {
744+
if (suite->pana_session.assy_length || suite->pana_session.frag_length || suite->pana_session.packet_delivered) {
745745
//Build next EAP Packet
746746
//tr_debug("TX same again fragment piece");
747747
tx_start_OK = pana_eap_frag_re_tx(suite);
748748

749749
} else {
750750
if (tls_pana_server_exchange_build(suite)) {
751+
suite->pana_session.packet_delivered = false;
751752
tx_start_OK = true;
752753
}
753754

0 commit comments

Comments
 (0)