diff options
-rw-r--r-- | src/lib/libcrypto/x509/x509_vpm.c | 56 |
1 files changed, 34 insertions, 22 deletions
diff --git a/src/lib/libcrypto/x509/x509_vpm.c b/src/lib/libcrypto/x509/x509_vpm.c index 62d9215b4c..927c79716e 100644 --- a/src/lib/libcrypto/x509/x509_vpm.c +++ b/src/lib/libcrypto/x509/x509_vpm.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: x509_vpm.c,v 1.44 2024/03/29 04:45:15 tb Exp $ */ | 1 | /* $OpenBSD: x509_vpm.c,v 1.45 2024/03/29 04:50:11 tb Exp $ */ |
2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 | * project 2004. | 3 | * project 2004. |
4 | */ | 4 | */ |
@@ -474,37 +474,49 @@ X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param, ASN1_OBJECT *policy) | |||
474 | } | 474 | } |
475 | LCRYPTO_ALIAS(X509_VERIFY_PARAM_add0_policy); | 475 | LCRYPTO_ALIAS(X509_VERIFY_PARAM_add0_policy); |
476 | 476 | ||
477 | static STACK_OF(ASN1_OBJECT) * | ||
478 | sk_ASN1_OBJECT_deep_copy(const STACK_OF(ASN1_OBJECT) *sk) | ||
479 | { | ||
480 | STACK_OF(ASN1_OBJECT) *objs; | ||
481 | ASN1_OBJECT *obj = NULL; | ||
482 | int i; | ||
483 | |||
484 | if ((objs = sk_ASN1_OBJECT_new_null()) == NULL) | ||
485 | goto err; | ||
486 | |||
487 | for (i = 0; i < sk_ASN1_OBJECT_num(sk); i++) { | ||
488 | if ((obj = OBJ_dup(sk_ASN1_OBJECT_value(sk, i))) == NULL) | ||
489 | goto err; | ||
490 | if (sk_ASN1_OBJECT_push(objs, obj) <= 0) | ||
491 | goto err; | ||
492 | obj = NULL; | ||
493 | } | ||
494 | |||
495 | return objs; | ||
496 | |||
497 | err: | ||
498 | sk_ASN1_OBJECT_pop_free(objs, ASN1_OBJECT_free); | ||
499 | ASN1_OBJECT_free(obj); | ||
500 | |||
501 | return NULL; | ||
502 | } | ||
503 | |||
477 | int | 504 | int |
478 | X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param, | 505 | X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param, |
479 | STACK_OF(ASN1_OBJECT) *policies) | 506 | STACK_OF(ASN1_OBJECT) *policies) |
480 | { | 507 | { |
481 | int i; | 508 | if (param == NULL) |
482 | ASN1_OBJECT *oid, *doid; | ||
483 | |||
484 | if (!param) | ||
485 | return 0; | 509 | return 0; |
486 | if (param->policies) | ||
487 | sk_ASN1_OBJECT_pop_free(param->policies, ASN1_OBJECT_free); | ||
488 | 510 | ||
489 | if (!policies) { | 511 | sk_ASN1_OBJECT_pop_free(param->policies, ASN1_OBJECT_free); |
490 | param->policies = NULL; | 512 | param->policies = NULL; |
513 | |||
514 | if (policies == NULL) | ||
491 | return 1; | 515 | return 1; |
492 | } | ||
493 | 516 | ||
494 | param->policies = sk_ASN1_OBJECT_new_null(); | 517 | if ((param->policies = sk_ASN1_OBJECT_deep_copy(policies)) == NULL) |
495 | if (!param->policies) | ||
496 | return 0; | 518 | return 0; |
497 | 519 | ||
498 | for (i = 0; i < sk_ASN1_OBJECT_num(policies); i++) { | ||
499 | oid = sk_ASN1_OBJECT_value(policies, i); | ||
500 | doid = OBJ_dup(oid); | ||
501 | if (!doid) | ||
502 | return 0; | ||
503 | if (!sk_ASN1_OBJECT_push(param->policies, doid)) { | ||
504 | ASN1_OBJECT_free(doid); | ||
505 | return 0; | ||
506 | } | ||
507 | } | ||
508 | return 1; | 520 | return 1; |
509 | } | 521 | } |
510 | LCRYPTO_ALIAS(X509_VERIFY_PARAM_set1_policies); | 522 | LCRYPTO_ALIAS(X509_VERIFY_PARAM_set1_policies); |