aboutsummaryrefslogtreecommitdiff
path: root/rpc_pkey.c
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2017-02-02 14:03:18 -0500
committerRob Austein <sra@hactrn.net>2017-02-02 14:03:18 -0500
commit6a6cc04dda8f613134ae5b30b702de3f1a4dff95 (patch)
tree19a470e43f453392d3f48a7439437698bbcd084b /rpc_pkey.c
parent9ec81408c25207149d8b3bfcfc80faf1c8ff0811 (diff)
Add locking around keystore operations.
Diffstat (limited to 'rpc_pkey.c')
-rw-r--r--rpc_pkey.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/rpc_pkey.c b/rpc_pkey.c
index e2e42c9..c0a6479 100644
--- a/rpc_pkey.c
+++ b/rpc_pkey.c
@@ -61,6 +61,9 @@ static hal_pkey_slot_t pkey_handle[HAL_STATIC_PKEY_STATE_BLOCKS];
static inline hal_pkey_slot_t *alloc_slot(const hal_key_flags_t flags)
{
+ hal_pkey_slot_t *slot = NULL;
+ hal_critical_section_start();
+
#if HAL_STATIC_PKEY_STATE_BLOCKS > 0
static uint16_t next_glop = 0;
uint32_t glop = ++next_glop << 16;
@@ -71,17 +74,18 @@ static inline hal_pkey_slot_t *alloc_slot(const hal_key_flags_t flags)
if ((flags & HAL_KEY_FLAG_TOKEN) != 0)
glop |= HAL_PKEY_HANDLE_TOKEN_FLAG;
- for (int i = 0; i < sizeof(pkey_handle)/sizeof(*pkey_handle); i++) {
+ for (int i = 0; slot == NULL && i < sizeof(pkey_handle)/sizeof(*pkey_handle); i++) {
if (pkey_handle[i].type != HAL_KEY_TYPE_NONE)
continue;
memset(&pkey_handle[i], 0, sizeof(pkey_handle[i]));
pkey_handle[i].pkey_handle.handle = i | glop;
pkey_handle[i].hint = -1;
- return &pkey_handle[i];
+ slot = &pkey_handle[i];
}
#endif
- return NULL;
+ hal_critical_section_end();
+ return slot;
}
/*
@@ -91,14 +95,18 @@ static inline hal_pkey_slot_t *alloc_slot(const hal_key_flags_t flags)
static inline hal_pkey_slot_t *find_handle(const hal_pkey_handle_t handle)
{
+ hal_pkey_slot_t *slot = NULL;
+ hal_critical_section_start();
+
#if HAL_STATIC_PKEY_STATE_BLOCKS > 0
const int i = (int) (handle.handle & 0xFFFF);
if (i < sizeof(pkey_handle)/sizeof(*pkey_handle) && pkey_handle[i].pkey_handle.handle == handle.handle)
- return &pkey_handle[i];
+ slot = &pkey_handle[i];
#endif
- return NULL;
+ hal_critical_section_end();
+ return slot;
}
/*