From d008267960337e9e44b270b26555a7a894808746 Mon Sep 17 00:00:00 2001 From: Rob Austein Date: Mon, 24 Apr 2017 08:33:11 -0400 Subject: Clean up pkey slots and volatile keys on client logout. --- rpc_misc.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 54 insertions(+), 15 deletions(-) (limited to 'rpc_misc.c') diff --git a/rpc_misc.c b/rpc_misc.c index cf5e4a0..2fd743a 100644 --- a/rpc_misc.c +++ b/rpc_misc.c @@ -101,21 +101,47 @@ static client_slot_t client_handle[HAL_STATIC_CLIENT_STATE_BLOCKS]; * them. HAL_USER_NONE indicates an empty slot in the table. */ -static inline client_slot_t *alloc_slot(void) +static inline client_slot_t *alloc_slot(const hal_client_handle_t client, + const hal_user_t user) { client_slot_t *slot = NULL; hal_critical_section_start(); #if HAL_STATIC_CLIENT_STATE_BLOCKS > 0 + + for (int i = 0; slot == NULL && i < sizeof(client_handle)/sizeof(*client_handle); i++) + if (client_handle[i].logged_in != HAL_USER_NONE && client_handle[i].handle.handle == handle.handle) + slot = &client_handle[i]; + for (int i = 0; slot == NULL && i < sizeof(client_handle)/sizeof(*client_handle); i++) if (client_handle[i].logged_in == HAL_USER_NONE) slot = &client_handle[i]; + #endif + if (slot != NULL) { + slot->handle = client; + slot->logged_in = user; + } + hal_critical_section_end(); return slot; } +static inline void clear_slot(client_slot_t *slot) +{ + if (slot == NULL) + return; + + hal_pkey_client_cleanup(slot->handle); + + hal_critical_section_start(); + + memset(slot, 0, sizeof(*slot)); + + hal_critical_section_end(); +} + static inline client_slot_t *find_handle(const hal_client_handle_t handle) { client_slot_t *slot = NULL; @@ -158,14 +184,9 @@ static hal_error_t login(const hal_client_handle_t client, if (diff != 0) return HAL_ERROR_PIN_INCORRECT; - client_slot_t *slot = find_handle(client); - - if (slot == NULL && (slot = alloc_slot()) == NULL) + if (alloc_slot(client, user) == NULL) return HAL_ERROR_NO_CLIENT_SLOTS_AVAILABLE; - slot->handle = client; - slot->logged_in = user; - return HAL_OK; } @@ -184,21 +205,39 @@ static hal_error_t is_logged_in(const hal_client_handle_t client, static hal_error_t logout(const hal_client_handle_t client) { - client_slot_t *slot = find_handle(client); - - if (slot != NULL) - slot->logged_in = HAL_USER_NONE; - - return HAL_OK; + return clear_slot(find_handle(client)); } static hal_error_t logout_all(void) { + /* + * This is a bit inefficient, but it lets us keep the control + * structure simple. + */ + + client_slot_t *slot; + hal_error_t err; + + do { + slot = NULL; + #if HAL_STATIC_CLIENT_STATE_BLOCKS > 0 - for (int i = 0; i < sizeof(client_handle)/sizeof(*client_handle); i++) - client_handle[i].logged_in = HAL_USER_NONE; + + hal_critical_section_start(); + + for (int i = 0; slot == NULL && i < sizeof(client_handle)/sizeof(*client_handle); i++) + if (client_handle[i].logged_in != HAL_USER_NONE) + slot = &client_handle[i]; + + hal_critical_section_end(); + #endif + if ((err = clear_slot(slot)) != HAL_OK) + return err; + + } while (slot != NULL); + return HAL_OK; } -- cgit v1.2.3 From 4ee44177c6da04e210a52528763b2c96a8f3d824 Mon Sep 17 00:00:00 2001 From: Rob Austein Date: Mon, 24 Apr 2017 17:23:17 -0400 Subject: Call a portable entrenching tool a portable entrenching tool. --- rpc_misc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'rpc_misc.c') diff --git a/rpc_misc.c b/rpc_misc.c index 2fd743a..4db6ed3 100644 --- a/rpc_misc.c +++ b/rpc_misc.c @@ -133,7 +133,7 @@ static inline void clear_slot(client_slot_t *slot) if (slot == NULL) return; - hal_pkey_client_cleanup(slot->handle); + hal_pkey_logout(slot->handle); hal_critical_section_start(); -- cgit v1.2.3 From 358b3803cdedad607cf649221d0b7e3ce66b45f2 Mon Sep 17 00:00:00 2001 From: Rob Austein Date: Tue, 25 Apr 2017 17:14:40 -0400 Subject: Shake dumb compile-time bugs out of new logout code. What I get for writing code while build and test environment is tied up with a multi-day run testing something else. --- rpc_misc.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'rpc_misc.c') diff --git a/rpc_misc.c b/rpc_misc.c index 4db6ed3..e9ff4c6 100644 --- a/rpc_misc.c +++ b/rpc_misc.c @@ -110,7 +110,8 @@ static inline client_slot_t *alloc_slot(const hal_client_handle_t client, #if HAL_STATIC_CLIENT_STATE_BLOCKS > 0 for (int i = 0; slot == NULL && i < sizeof(client_handle)/sizeof(*client_handle); i++) - if (client_handle[i].logged_in != HAL_USER_NONE && client_handle[i].handle.handle == handle.handle) + if (client_handle[i].logged_in != HAL_USER_NONE && + client_handle[i].handle.handle == client.handle) slot = &client_handle[i]; for (int i = 0; slot == NULL && i < sizeof(client_handle)/sizeof(*client_handle); i++) @@ -128,18 +129,23 @@ static inline client_slot_t *alloc_slot(const hal_client_handle_t client, return slot; } -static inline void clear_slot(client_slot_t *slot) +static inline hal_error_t clear_slot(client_slot_t *slot) { if (slot == NULL) - return; + return HAL_OK; + + hal_error_t err; - hal_pkey_logout(slot->handle); + if ((err = hal_pkey_logout(slot->handle)) != HAL_OK) + return err; hal_critical_section_start(); memset(slot, 0, sizeof(*slot)); hal_critical_section_end(); + + return HAL_OK; } static inline client_slot_t *find_handle(const hal_client_handle_t handle) -- cgit v1.2.3