Skip to content

Commit 570123d

Browse files
author
Mika Leppänen
authored
Merge pull request #2015 from ARMmbed/tls_free
Corrected TLS library free on failure cases
2 parents 1d7693b + 798b513 commit 570123d

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)