diff options
author | Rob Austein <sra@hactrn.net> | 2017-04-23 19:54:25 -0400 |
---|---|---|
committer | Rob Austein <sra@hactrn.net> | 2017-04-23 19:54:25 -0400 |
commit | 42aefa36bc89373125f88bb8f9a504b64f7bba0f (patch) | |
tree | 026f91faa1ff75c551b1fba84182fb8bbab8296d | |
parent | c9fc4a5779db08a6c8a0029b779826a188d8b438 (diff) |
Wrap keyslot clearing in a critical section.
I doubt this change will have any noticable effect, but it's another
theoretical race condition, might as well eliminate it.
-rw-r--r-- | rpc_pkey.c | 21 |
1 files changed, 18 insertions, 3 deletions
@@ -93,6 +93,21 @@ static inline hal_pkey_slot_t *alloc_slot(const hal_key_flags_t flags) } /* + * Clear a slot. Probably not necessary to do this in a critical + * section, but be safe. + */ + +static inline void clear_slot(hal_pkey_slot_t *slot) +{ + hal_critical_section_start(); + + if (slot != NULL) + memset(slot, 0, sizeof(*slot)); + + hal_critical_section_end(); +} + +/* * Check a caller-supplied handle. Must be in range, in use, and have * the right glop. Returns slot pointer on success, NULL otherwise. */ @@ -395,7 +410,7 @@ static hal_error_t pkey_local_open(const hal_client_handle_t client, return HAL_OK; fail: - memset(slot, 0, sizeof(*slot)); + clear_slot(slot); return err; } @@ -537,7 +552,7 @@ static hal_error_t pkey_local_close(const hal_pkey_handle_t pkey) if ((slot = find_handle(pkey)) == NULL) return HAL_ERROR_KEY_NOT_FOUND; - memset(slot, 0, sizeof(*slot)); + clear_slot(slot); return HAL_OK; } @@ -566,7 +581,7 @@ static hal_error_t pkey_local_delete(const hal_pkey_handle_t pkey) (void) hal_ks_close(ks); if (err == HAL_OK || err == HAL_ERROR_KEY_NOT_FOUND) - memset(slot, 0, sizeof(*slot)); + clear_slot(slot); return err; } |