diff options
author | Eric Richter <erichte@linux.ibm.com> | 2020-09-16 11:21:17 -0500 |
---|---|---|
committer | Oliver O'Halloran <oohall@gmail.com> | 2020-10-01 13:44:06 +1000 |
commit | f356c0671e5d99775ccde2e2b7f621f5fd0ea6d6 (patch) | |
tree | 81e2ed037d65183be45ad74a53643e14de24a962 /libstb | |
parent | c5c71a51616b6011c5a1ff59feb3618df6beb5b0 (diff) | |
download | skiboot-f356c0671e5d99775ccde2e2b7f621f5fd0ea6d6.zip skiboot-f356c0671e5d99775ccde2e2b7f621f5fd0ea6d6.tar.gz skiboot-f356c0671e5d99775ccde2e2b7f621f5fd0ea6d6.tar.bz2 |
secvar_util: add new helper functions
This patch adds the following helper functions:
- dealloc_secvar()
- new_secvar()
- copy_bank_list()
dealloc_secvar() frees a whole secvar_node reference including
its children allocations. This also updates the clear_bank_list()
helper function to use this destructor.
new_secvar() allocates a secvar_node, and fills it with data
provided via arguments.
copy_bank_list() creates a deep copy of a secvar bank list
Signed-off-by: Eric Richter <erichte@linux.ibm.com>
Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
Diffstat (limited to 'libstb')
-rw-r--r-- | libstb/secvar/secvar.h | 5 | ||||
-rw-r--r-- | libstb/secvar/secvar_util.c | 63 |
2 files changed, 65 insertions, 3 deletions
diff --git a/libstb/secvar/secvar.h b/libstb/secvar/secvar.h index a0cafbb..b141b70 100644 --- a/libstb/secvar/secvar.h +++ b/libstb/secvar/secvar.h @@ -43,8 +43,13 @@ extern struct secvar_backend_driver secvar_backend; // Helper functions void clear_bank_list(struct list_head *bank); +int copy_bank_list(struct list_head *dst, struct list_head *src); struct secvar_node *alloc_secvar(uint64_t size); +struct secvar_node *new_secvar(const char *key, uint64_t key_len, + const char *data, uint64_t data_size, + uint64_t flags); int realloc_secvar(struct secvar_node *node, uint64_t size); +void dealloc_secvar(struct secvar_node *node); struct secvar_node *find_secvar(const char *key, uint64_t key_len, struct list_head *bank); int is_key_empty(const char *key, uint64_t key_len); int list_length(struct list_head *bank); diff --git a/libstb/secvar/secvar_util.c b/libstb/secvar/secvar_util.c index 2005de5..3aadbd9 100644 --- a/libstb/secvar/secvar_util.c +++ b/libstb/secvar/secvar_util.c @@ -20,11 +20,31 @@ void clear_bank_list(struct list_head *bank) list_for_each_safe(bank, node, next, link) { list_del(&node->link); + dealloc_secvar(node); + } +} + +int copy_bank_list(struct list_head *dst, struct list_head *src) +{ + struct secvar_node *node, *tmp; - if (node->var) - free(node->var); - free(node); + list_for_each(src, node, link) { + /* Allocate new secvar using actual data size */ + tmp = alloc_secvar(node->var->data_size); + if (!tmp) + return OPAL_NO_MEM; + + /* Copy over flags metadata */ + tmp->flags = node->flags; + + /* Full-clone over the secvar struct */ + memcpy(tmp->var, node->var, tmp->size + sizeof(struct secvar)); + + /* Append to new list */ + list_add_tail(dst, &tmp->link); } + + return OPAL_SUCCESS; } struct secvar_node *alloc_secvar(uint64_t size) @@ -46,6 +66,34 @@ struct secvar_node *alloc_secvar(uint64_t size) return ret; } +struct secvar_node *new_secvar(const char *key, uint64_t key_len, + const char *data, uint64_t data_size, + uint64_t flags) +{ + struct secvar_node *ret; + + if (!key) + return NULL; + if ((!key_len) || (key_len > SECVAR_MAX_KEY_LEN)) + return NULL; + if ((!data) && (data_size)) + return NULL; + + ret = alloc_secvar(data_size); + if (!ret) + return NULL; + + ret->var->key_len = key_len; + ret->var->data_size = data_size; + memcpy(ret->var->key, key, key_len); + ret->flags = flags; + + if (data) + memcpy(ret->var->data, data, data_size); + + return ret; +} + int realloc_secvar(struct secvar_node *node, uint64_t size) { void *tmp; @@ -64,6 +112,15 @@ int realloc_secvar(struct secvar_node *node, uint64_t size) return 0; } +void dealloc_secvar(struct secvar_node *node) +{ + if (!node) + return; + + free(node->var); + free(node); +} + struct secvar_node *find_secvar(const char *key, uint64_t key_len, struct list_head *bank) { struct secvar_node *node = NULL; |