diff options
-rw-r--r-- | src/lib/libcrypto/x509/x509_lu.c | 143 |
1 files changed, 77 insertions, 66 deletions
diff --git a/src/lib/libcrypto/x509/x509_lu.c b/src/lib/libcrypto/x509/x509_lu.c index 695252fc87..9c18c16eeb 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.47 2021/11/05 20:35:14 tb Exp $ */ | 1 | /* $OpenBSD: x509_lu.c,v 1.48 2021/11/05 21:39:45 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 | * |
@@ -533,102 +533,113 @@ X509_OBJECT_get0_X509_CRL(X509_OBJECT *xo) | |||
533 | } | 533 | } |
534 | 534 | ||
535 | STACK_OF(X509) * | 535 | STACK_OF(X509) * |
536 | X509_STORE_get1_certs(X509_STORE_CTX *ctx, X509_NAME *nm) | 536 | X509_STORE_get1_certs(X509_STORE_CTX *ctx, X509_NAME *name) |
537 | { | 537 | { |
538 | int i, idx, cnt; | 538 | X509_STORE *store = ctx->ctx; |
539 | STACK_OF(X509) *sk; | 539 | STACK_OF(X509) *sk; |
540 | X509 *x; | 540 | X509 *x = NULL; |
541 | X509_OBJECT *obj; | 541 | X509_OBJECT *obj; |
542 | int i, idx, cnt; | ||
542 | 543 | ||
543 | if (ctx->ctx == NULL) | 544 | if (store == NULL) |
544 | return NULL; | 545 | return NULL; |
545 | sk = sk_X509_new_null(); | 546 | |
546 | if (sk == NULL) | 547 | CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); |
548 | idx = x509_object_idx_cnt(store->objs, X509_LU_X509, name, &cnt); | ||
549 | if (idx >= 0) | ||
550 | goto found; | ||
551 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | ||
552 | |||
553 | /* Nothing found: do lookup to possibly add new objects to cache. */ | ||
554 | obj = X509_STORE_CTX_get_obj_by_subject(ctx, X509_LU_X509, name); | ||
555 | if (obj == NULL) | ||
547 | return NULL; | 556 | return NULL; |
557 | |||
558 | X509_OBJECT_free(obj); | ||
559 | obj = NULL; | ||
560 | |||
548 | CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); | 561 | CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); |
549 | idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_X509, nm, &cnt); | 562 | idx = x509_object_idx_cnt(store->objs, X509_LU_X509, name, &cnt); |
550 | if (idx < 0) { | 563 | if (idx >= 0) |
551 | /* Nothing found in cache: do lookup to possibly add new | 564 | goto found; |
552 | * objects to cache | 565 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); |
553 | */ | 566 | |
554 | X509_OBJECT xobj; | 567 | return NULL; |
555 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | 568 | |
556 | if (!X509_STORE_get_by_subject(ctx, X509_LU_X509, nm, &xobj)) { | 569 | found: |
557 | sk_X509_free(sk); | 570 | if ((sk = sk_X509_new_null()) == NULL) |
558 | return NULL; | 571 | goto err; |
559 | } | 572 | |
560 | X509_OBJECT_free_contents(&xobj); | ||
561 | CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); | ||
562 | idx = x509_object_idx_cnt(ctx->ctx->objs, | ||
563 | X509_LU_X509, nm, &cnt); | ||
564 | if (idx < 0) { | ||
565 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | ||
566 | sk_X509_free(sk); | ||
567 | return NULL; | ||
568 | } | ||
569 | } | ||
570 | for (i = 0; i < cnt; i++, idx++) { | 573 | for (i = 0; i < cnt; i++, idx++) { |
571 | obj = sk_X509_OBJECT_value(ctx->ctx->objs, idx); | 574 | obj = sk_X509_OBJECT_value(store->objs, idx); |
575 | |||
572 | x = obj->data.x509; | 576 | x = obj->data.x509; |
573 | CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509); | 577 | if (!X509_up_ref(x)) { |
574 | if (!sk_X509_push(sk, x)) { | 578 | x = NULL; |
575 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | 579 | goto err; |
576 | X509_free(x); | ||
577 | sk_X509_pop_free(sk, X509_free); | ||
578 | return NULL; | ||
579 | } | 580 | } |
581 | if (!sk_X509_push(sk, x)) | ||
582 | goto err; | ||
580 | } | 583 | } |
584 | |||
581 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | 585 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); |
582 | return sk; | 586 | return sk; |
583 | 587 | ||
588 | err: | ||
589 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | ||
590 | sk_X509_pop_free(sk, X509_free); | ||
591 | X509_free(x); | ||
592 | return NULL; | ||
584 | } | 593 | } |
585 | 594 | ||
586 | STACK_OF(X509_CRL) * | 595 | STACK_OF(X509_CRL) * |
587 | X509_STORE_get1_crls(X509_STORE_CTX *ctx, X509_NAME *nm) | 596 | X509_STORE_get1_crls(X509_STORE_CTX *ctx, X509_NAME *name) |
588 | { | 597 | { |
598 | X509_STORE *store = ctx->ctx; | ||
599 | STACK_OF(X509_CRL) *sk = NULL; | ||
600 | X509_CRL *x = NULL; | ||
601 | X509_OBJECT *obj = NULL; | ||
589 | int i, idx, cnt; | 602 | int i, idx, cnt; |
590 | STACK_OF(X509_CRL) *sk; | ||
591 | X509_CRL *x; | ||
592 | X509_OBJECT *obj, xobj; | ||
593 | 603 | ||
594 | if (ctx->ctx == NULL) | 604 | if (store == NULL) |
595 | return NULL; | ||
596 | sk = sk_X509_CRL_new_null(); | ||
597 | if (sk == NULL) | ||
598 | return NULL; | 605 | return NULL; |
599 | CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); | ||
600 | /* Check cache first */ | ||
601 | idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_CRL, nm, &cnt); | ||
602 | 606 | ||
603 | /* Always do lookup to possibly add new CRLs to cache | 607 | /* Always do lookup to possibly add new CRLs to cache */ |
604 | */ | 608 | obj = X509_STORE_CTX_get_obj_by_subject(ctx, X509_LU_CRL, name); |
605 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | 609 | if (obj == NULL) |
606 | if (!X509_STORE_get_by_subject(ctx, X509_LU_CRL, nm, &xobj)) { | ||
607 | sk_X509_CRL_free(sk); | ||
608 | return NULL; | 610 | return NULL; |
609 | } | 611 | |
610 | X509_OBJECT_free_contents(&xobj); | 612 | X509_OBJECT_free(obj); |
613 | obj = NULL; | ||
614 | |||
611 | CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); | 615 | CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); |
612 | idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_CRL, nm, &cnt); | 616 | idx = x509_object_idx_cnt(store->objs, X509_LU_CRL, name, &cnt); |
613 | if (idx < 0) { | 617 | if (idx < 0) |
614 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | 618 | goto err; |
615 | sk_X509_CRL_free(sk); | 619 | |
616 | return NULL; | 620 | if ((sk = sk_X509_CRL_new_null()) == NULL) |
617 | } | 621 | goto err; |
618 | 622 | ||
619 | for (i = 0; i < cnt; i++, idx++) { | 623 | for (i = 0; i < cnt; i++, idx++) { |
620 | obj = sk_X509_OBJECT_value(ctx->ctx->objs, idx); | 624 | obj = sk_X509_OBJECT_value(store->objs, idx); |
625 | |||
621 | x = obj->data.crl; | 626 | x = obj->data.crl; |
622 | CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509_CRL); | 627 | if (!X509_CRL_up_ref(x)) { |
623 | if (!sk_X509_CRL_push(sk, x)) { | 628 | x = NULL; |
624 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | 629 | goto err; |
625 | X509_CRL_free(x); | ||
626 | sk_X509_CRL_pop_free(sk, X509_CRL_free); | ||
627 | return NULL; | ||
628 | } | 630 | } |
631 | if (!sk_X509_CRL_push(sk, x)) | ||
632 | goto err; | ||
629 | } | 633 | } |
634 | |||
630 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | 635 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); |
631 | return sk; | 636 | return sk; |
637 | |||
638 | err: | ||
639 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | ||
640 | X509_CRL_free(x); | ||
641 | sk_X509_CRL_pop_free(sk, X509_CRL_free); | ||
642 | return NULL; | ||
632 | } | 643 | } |
633 | 644 | ||
634 | X509_OBJECT * | 645 | X509_OBJECT * |