aboutsummaryrefslogtreecommitdiff
path: root/ks_volatile.c
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2016-11-15 02:02:24 -0500
committerRob Austein <sra@hactrn.net>2016-11-15 02:02:24 -0500
commitecbc49a97941b208fb162e4a6d10ca7277dc9359 (patch)
tree3fa814db2f2b559c02449b524328b148c1286f43 /ks_volatile.c
parent2806585aad4b4910156cbaa24c8ea027c572365f (diff)
Allow keystore reinitialization without re-allocating static memory.
Wiping the keystore flash requires reinitializing the keystore, but we don't want to allocate new static memory when we do this.
Diffstat (limited to 'ks_volatile.c')
-rw-r--r--ks_volatile.c37
1 files changed, 23 insertions, 14 deletions
diff --git a/ks_volatile.c b/ks_volatile.c
index 0ee19c8..e23aefe 100644
--- a/ks_volatile.c
+++ b/ks_volatile.c
@@ -143,20 +143,19 @@ static hal_error_t ks_init(const hal_ks_driver_t * const driver,
uint8_t *mem,
size_t len)
{
- if (ksv == NULL || mem == NULL)
+ if (ksv == NULL)
return HAL_ERROR_IMPOSSIBLE;
- memset(ksv, 0, sizeof(*ksv));
- memset(mem, 0, len);
+ if (mem != NULL) {
+ memset(ksv, 0, sizeof(*ksv));
+ memset(mem, 0, len);
- ksv->ks.driver = driver;
- ksv->per_session = per_session;
- ksv->db = gnaw(&mem, &len, sizeof(*ksv->db));
- ksv->db->ksi.index = gnaw(&mem, &len, sizeof(*ksv->db->ksi.index) * STATIC_KS_VOLATILE_SLOTS);
- ksv->db->ksi.names = gnaw(&mem, &len, sizeof(*ksv->db->ksi.names) * STATIC_KS_VOLATILE_SLOTS);
- ksv->db->keys = gnaw(&mem, &len, sizeof(*ksv->db->keys) * STATIC_KS_VOLATILE_SLOTS);
- ksv->db->ksi.size = STATIC_KS_VOLATILE_SLOTS;
- ksv->db->ksi.used = 0;
+ ksv->db = gnaw(&mem, &len, sizeof(*ksv->db));
+ ksv->db->ksi.index = gnaw(&mem, &len, sizeof(*ksv->db->ksi.index) * STATIC_KS_VOLATILE_SLOTS);
+ ksv->db->ksi.names = gnaw(&mem, &len, sizeof(*ksv->db->ksi.names) * STATIC_KS_VOLATILE_SLOTS);
+ ksv->db->keys = gnaw(&mem, &len, sizeof(*ksv->db->keys) * STATIC_KS_VOLATILE_SLOTS);
+ ksv->db->ksi.size = STATIC_KS_VOLATILE_SLOTS;
+ }
if (ksv->db == NULL ||
ksv->db->ksi.index == NULL ||
@@ -164,6 +163,16 @@ static hal_error_t ks_init(const hal_ks_driver_t * const driver,
ksv->db->keys == NULL)
return HAL_ERROR_IMPOSSIBLE;
+ if (mem == NULL) {
+ memset(ksv->db->ksi.index, 0, sizeof(*ksv->db->ksi.index) * STATIC_KS_VOLATILE_SLOTS);
+ memset(ksv->db->ksi.names, 0, sizeof(*ksv->db->ksi.names) * STATIC_KS_VOLATILE_SLOTS);
+ memset(ksv->db->keys, 0, sizeof(*ksv->db->keys) * STATIC_KS_VOLATILE_SLOTS);
+ }
+
+ ksv->ks.driver = driver;
+ ksv->per_session = per_session;
+ ksv->db->ksi.used = 0;
+
/*
* Set up keystore with empty index and full free list.
* Since this driver doesn't care about wear leveling,
@@ -176,16 +185,16 @@ static hal_error_t ks_init(const hal_ks_driver_t * const driver,
return hal_ks_index_setup(&ksv->db->ksi);
}
-static hal_error_t ks_volatile_init(const hal_ks_driver_t * const driver)
+static hal_error_t ks_volatile_init(const hal_ks_driver_t * const driver, const int alloc)
{
const size_t len = (sizeof(*volatile_ks.db) +
sizeof(*volatile_ks.db->ksi.index) * STATIC_KS_VOLATILE_SLOTS +
sizeof(*volatile_ks.db->ksi.names) * STATIC_KS_VOLATILE_SLOTS +
sizeof(*volatile_ks.db->keys) * STATIC_KS_VOLATILE_SLOTS);
- uint8_t *mem = hal_allocate_static_memory(len);
+ uint8_t *mem = NULL;
- if (mem == NULL)
+ if (alloc && (mem = hal_allocate_static_memory(len)) == NULL)
return HAL_ERROR_ALLOCATION_FAILURE;
return ks_init(driver, 1, &volatile_ks, mem, len);