diff options
Diffstat (limited to 'src/lib/libcrypto/x509/x509_lu.c')
-rw-r--r-- | src/lib/libcrypto/x509/x509_lu.c | 67 |
1 files changed, 66 insertions, 1 deletions
diff --git a/src/lib/libcrypto/x509/x509_lu.c b/src/lib/libcrypto/x509/x509_lu.c index 6bdae0f5c4..7e7a5dedd0 100644 --- a/src/lib/libcrypto/x509/x509_lu.c +++ b/src/lib/libcrypto/x509/x509_lu.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: x509_lu.c,v 1.62 2023/12/27 01:55:25 tb Exp $ */ | 1 | /* $OpenBSD: x509_lu.c,v 1.63 2024/02/23 10:39:07 tb Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -246,6 +246,24 @@ X509_OBJECT_free(X509_OBJECT *a) | |||
246 | } | 246 | } |
247 | LCRYPTO_ALIAS(X509_OBJECT_free); | 247 | LCRYPTO_ALIAS(X509_OBJECT_free); |
248 | 248 | ||
249 | static X509_OBJECT * | ||
250 | x509_object_dup(const X509_OBJECT *obj) | ||
251 | { | ||
252 | X509_OBJECT *copy; | ||
253 | |||
254 | if ((copy = X509_OBJECT_new()) == NULL) { | ||
255 | X509error(ERR_R_MALLOC_FAILURE); | ||
256 | return NULL; | ||
257 | } | ||
258 | |||
259 | copy->type = obj->type; | ||
260 | copy->data = obj->data; | ||
261 | |||
262 | X509_OBJECT_up_ref_count(copy); | ||
263 | |||
264 | return copy; | ||
265 | } | ||
266 | |||
249 | void | 267 | void |
250 | X509_STORE_free(X509_STORE *store) | 268 | X509_STORE_free(X509_STORE *store) |
251 | { | 269 | { |
@@ -785,6 +803,53 @@ X509_STORE_get0_objects(X509_STORE *xs) | |||
785 | } | 803 | } |
786 | LCRYPTO_ALIAS(X509_STORE_get0_objects); | 804 | LCRYPTO_ALIAS(X509_STORE_get0_objects); |
787 | 805 | ||
806 | static STACK_OF(X509_OBJECT) * | ||
807 | sk_X509_OBJECT_deep_copy(const STACK_OF(X509_OBJECT) *objs) | ||
808 | { | ||
809 | STACK_OF(X509_OBJECT) *copy = NULL; | ||
810 | X509_OBJECT *obj = NULL; | ||
811 | int i; | ||
812 | |||
813 | if ((copy = sk_X509_OBJECT_new(x509_object_cmp)) == NULL) { | ||
814 | X509error(ERR_R_MALLOC_FAILURE); | ||
815 | goto err; | ||
816 | } | ||
817 | |||
818 | for (i = 0; i < sk_X509_OBJECT_num(objs); i++) { | ||
819 | if ((obj = x509_object_dup(sk_X509_OBJECT_value(objs, i))) == NULL) | ||
820 | goto err; | ||
821 | if (!sk_X509_OBJECT_push(copy, obj)) | ||
822 | goto err; | ||
823 | obj = NULL; | ||
824 | } | ||
825 | |||
826 | return copy; | ||
827 | |||
828 | err: | ||
829 | X509_OBJECT_free(obj); | ||
830 | sk_X509_OBJECT_pop_free(copy, X509_OBJECT_free); | ||
831 | |||
832 | return NULL; | ||
833 | } | ||
834 | |||
835 | STACK_OF(X509_OBJECT) * | ||
836 | X509_STORE_get1_objects(X509_STORE *store) | ||
837 | { | ||
838 | STACK_OF(X509_OBJECT) *objs; | ||
839 | |||
840 | if (store == NULL) { | ||
841 | X509error(ERR_R_PASSED_NULL_PARAMETER); | ||
842 | return NULL; | ||
843 | } | ||
844 | |||
845 | CRYPTO_r_lock(CRYPTO_LOCK_X509_STORE); | ||
846 | objs = sk_X509_OBJECT_deep_copy(store->objs); | ||
847 | CRYPTO_r_unlock(CRYPTO_LOCK_X509_STORE); | ||
848 | |||
849 | return objs; | ||
850 | } | ||
851 | LCRYPTO_ALIAS(X509_STORE_get1_objects); | ||
852 | |||
788 | void * | 853 | void * |
789 | X509_STORE_get_ex_data(X509_STORE *xs, int idx) | 854 | X509_STORE_get_ex_data(X509_STORE *xs, int idx) |
790 | { | 855 | { |