Skip to content

Commit 798b513

Browse files
author
Mika Leppänen
committed
Corrected TLS library free on failure cases
TLS library is now correctly freed in case TLS handshake fails to message retry failures or if ifdown is called while TLS negotiation.
1 parent 5fa004c commit 798b513

File tree

5 files changed

+31
-20
lines changed

5 files changed

+31
-20
lines changed

source/Security/protocols/eap_tls_sec_prot/auth_eap_tls_sec_prot.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -336,12 +336,7 @@ static void auth_eap_tls_sec_prot_init_tls(sec_prot_t *prot)
336336

337337
static void auth_eap_tls_sec_prot_delete_tls(sec_prot_t *prot)
338338
{
339-
eap_tls_sec_prot_int_t *data = eap_tls_sec_prot_get(prot);
340-
// If initialized, TLS terminates on its own
341-
if (data->tls_prot) {
342-
return;
343-
}
344-
339+
// Triggers TLS to terminate if it is not already terminating by its own
345340
sec_prot_t *tls_prot = prot->type_get(prot, SEC_PROT_TYPE_TLS);
346341
if (tls_prot) {
347342
tls_prot->finished_send(tls_prot);

source/Security/protocols/eap_tls_sec_prot/supp_eap_tls_sec_prot.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -346,12 +346,7 @@ static void supp_eap_tls_sec_prot_init_tls(sec_prot_t *prot)
346346

347347
static void supp_eap_tls_sec_prot_delete_tls(sec_prot_t *prot)
348348
{
349-
eap_tls_sec_prot_int_t *data = eap_tls_sec_prot_get(prot);
350-
// If initialized, TLS terminates on its own
351-
if (data->tls_prot) {
352-
return;
353-
}
354-
349+
// Triggers TLS to terminate if it is not already terminating by its own
355350
sec_prot_t *tls_prot = prot->type_get(prot, SEC_PROT_TYPE_TLS);
356351
if (tls_prot) {
357352
tls_prot->finished_send(tls_prot);

source/Security/protocols/sec_prot_lib.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,12 @@ void sec_prot_state_set(sec_prot_t *prot, sec_prot_common_t *data, uint8_t state
109109
return;
110110

111111
case SEC_STATE_FINISHED:
112-
// Wait for timeout
112+
// If not already on finished state
113+
if (data->state != SEC_STATE_FINISHED) {
114+
// Wait for timeout
115+
data->ticks = SEC_FINISHED_TIMEOUT;
116+
}
113117
data->trickle_running = false;
114-
data->ticks = SEC_FINISHED_TIMEOUT;
115118

116119
// Disables receiving of messages when state machine sets SEC_STATE_FINISHED
117120
prot->receive_disable(prot);

source/Security/protocols/tls_sec_prot/tls_sec_prot.c

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,10 @@ typedef struct {
6363
tls_data_t tls_recv; /**< TLS receive buffer */
6464
uint32_t int_timer; /**< TLS intermediate timer timeout */
6565
uint32_t fin_timer; /**< TLS final timer timeout */
66-
bool timer_running; /**< TLS timer running */
67-
bool finished; /**< TLS finished */
68-
bool calculating; /**< TLS is calculating */
66+
bool timer_running : 1; /**< TLS timer running */
67+
bool finished : 1; /**< TLS finished */
68+
bool calculating : 1; /**< TLS is calculating */
69+
bool library_init : 1; /**< TLS library has been initialized */
6970
tls_sec_prot_lib_int_t *tls_sec_inst; /**< TLS security library storage, SHALL BE THE LAST FIELD */
7071
} tls_sec_prot_int_t;
7172

@@ -149,6 +150,7 @@ static int8_t client_tls_sec_prot_init(sec_prot_t *prot)
149150
data->fin_timer = 0;
150151
data->timer_running = false;
151152
data->calculating = false;
153+
data->library_init = false;
152154
return 0;
153155
}
154156

@@ -176,6 +178,7 @@ static int8_t server_tls_sec_prot_init(sec_prot_t *prot)
176178
data->fin_timer = 0;
177179
data->timer_running = false;
178180
data->calculating = false;
181+
data->library_init = false;
179182
return 0;
180183
}
181184

@@ -184,6 +187,9 @@ static void tls_sec_prot_delete(sec_prot_t *prot)
184187
tls_sec_prot_int_t *data = tls_sec_prot_get(prot);
185188
eap_tls_sec_prot_lib_message_free(&data->tls_send);
186189
eap_tls_sec_prot_lib_message_free(&data->tls_recv);
190+
if (data->library_init) {
191+
tls_sec_prot_lib_free((tls_security_t *) &data->tls_sec_inst);
192+
}
187193
}
188194

189195
static void tls_sec_prot_create_request(sec_prot_t *prot, sec_prot_keys_t *sec_keys)
@@ -323,9 +329,14 @@ static void client_tls_sec_prot_state_machine(sec_prot_t *prot)
323329
sec_prot_state_set(prot, &data->common, TLS_STATE_FINISHED);
324330

325331
tls_sec_prot_lib_free((tls_security_t *) &data->tls_sec_inst);
332+
data->library_init = false;
326333
break;
327334

328335
case TLS_STATE_FINISHED:
336+
if (data->library_init) {
337+
tls_sec_prot_lib_free((tls_security_t *) &data->tls_sec_inst);
338+
data->library_init = false;
339+
}
329340
prot->timer_stop(prot);
330341
prot->finished(prot);
331342
break;
@@ -418,9 +429,14 @@ static void server_tls_sec_prot_state_machine(sec_prot_t *prot)
418429
sec_prot_state_set(prot, &data->common, TLS_STATE_FINISHED);
419430

420431
tls_sec_prot_lib_free((tls_security_t *) &data->tls_sec_inst);
432+
data->library_init = false;
421433
break;
422434

423435
case TLS_STATE_FINISHED:
436+
if (data->library_init) {
437+
tls_sec_prot_lib_free((tls_security_t *) &data->tls_sec_inst);
438+
data->library_init = false;
439+
}
424440
prot->timer_stop(prot);
425441
prot->finished(prot);
426442
break;
@@ -537,6 +553,8 @@ static int8_t tls_sec_prot_tls_configure_and_connect(sec_prot_t *prot, bool is_s
537553
{
538554
tls_sec_prot_int_t *data = tls_sec_prot_get(prot);
539555

556+
// Must be free if library initialize is done
557+
data->library_init = true;
540558
if (tls_sec_prot_lib_init((tls_security_t *)&data->tls_sec_inst) < 0) {
541559
return -1;
542560
}

source/Security/protocols/tls_sec_prot/tls_sec_prot_lib.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,9 @@ int8_t tls_sec_prot_lib_init(tls_security_t *sec)
110110
mbedtls_x509_crt_init(&sec->owncert);
111111
mbedtls_pk_init(&sec->pkey);
112112

113+
sec->crl = NULL;
114+
sec->step = 0;
115+
113116
if (mbedtls_entropy_add_source(&sec->entropy, tls_sec_lib_entropy_poll, NULL,
114117
128, MBEDTLS_ENTROPY_SOURCE_WEAK) < 0) {
115118
return -1;
@@ -120,9 +123,6 @@ int8_t tls_sec_prot_lib_init(tls_security_t *sec)
120123
return -1;
121124
}
122125

123-
sec->crl = NULL;
124-
sec->step = 0;
125-
126126
return 0;
127127
}
128128

0 commit comments

Comments
 (0)