diff options
Diffstat (limited to 'src/crypto/stack/stack.c')
-rw-r--r-- | src/crypto/stack/stack.c | 38 |
1 files changed, 31 insertions, 7 deletions
diff --git a/src/crypto/stack/stack.c b/src/crypto/stack/stack.c index 0b336ba..c584515 100644 --- a/src/crypto/stack/stack.c +++ b/src/crypto/stack/stack.c @@ -86,9 +86,7 @@ _STACK *sk_new(stack_cmp_func comp) { return ret; err: - if (ret) { - OPENSSL_free(ret); - } + OPENSSL_free(ret); return NULL; } @@ -232,7 +230,7 @@ int sk_find(_STACK *sk, size_t *out_index, void *p) { int (*comp_func)(const void *,const void *); if (sk == NULL) { - return -1; + return 0; } if (sk->comp == NULL) { @@ -324,9 +322,7 @@ _STACK *sk_dup(const _STACK *sk) { return ret; err: - if (ret) { - sk_free(ret); - } + sk_free(ret); return NULL; } @@ -360,3 +356,31 @@ stack_cmp_func sk_set_cmp_func(_STACK *sk, stack_cmp_func comp) { return old; } + +_STACK *sk_deep_copy(const _STACK *sk, void *(*copy_func)(void *), + void (*free_func)(void *)) { + _STACK *ret = sk_dup(sk); + if (ret == NULL) { + return NULL; + } + + size_t i; + for (i = 0; i < ret->num; i++) { + if (ret->data[i] == NULL) { + continue; + } + ret->data[i] = copy_func(ret->data[i]); + if (ret->data[i] == NULL) { + size_t j; + for (j = 0; j < i; j++) { + if (ret->data[j] != NULL) { + free_func(ret->data[j]); + } + } + sk_free(ret); + return NULL; + } + } + + return ret; +} |