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 | { |
