summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortb <>2024-03-29 04:50:11 +0000
committertb <>2024-03-29 04:50:11 +0000
commit85218251e0b479212b2e2c267e504d095975edae (patch)
treea61cc09104315091d4f55dc8c023f57e5e93257d
parentc282f5d486e0f98cf3d6a665f95054e3b9e5b3dc (diff)
downloadopenbsd-85218251e0b479212b2e2c267e504d095975edae.tar.gz
openbsd-85218251e0b479212b2e2c267e504d095975edae.tar.bz2
openbsd-85218251e0b479212b2e2c267e504d095975edae.zip
Make X509_VERIFY_PARAM_set1_policies() less bad
If any OBJ_dup() fails along the way, a partially copied policy stack would remain on the params object. This makes no sense. Implement and use an sk_ASN1_OBJECT_deep_copy(), that copies the full stack or else returns NULL. Remove unnecessary NULL check and streamline some other logic. ok jsing
-rw-r--r--src/lib/libcrypto/x509/x509_vpm.c56
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}
475LCRYPTO_ALIAS(X509_VERIFY_PARAM_add0_policy); 475LCRYPTO_ALIAS(X509_VERIFY_PARAM_add0_policy);
476 476
477static STACK_OF(ASN1_OBJECT) *
478sk_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
477int 504int
478X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param, 505X509_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}
510LCRYPTO_ALIAS(X509_VERIFY_PARAM_set1_policies); 522LCRYPTO_ALIAS(X509_VERIFY_PARAM_set1_policies);