diff options
Diffstat (limited to 'src/lib/libssl/ssl_cert.c')
-rw-r--r-- | src/lib/libssl/ssl_cert.c | 164 |
1 files changed, 83 insertions, 81 deletions
diff --git a/src/lib/libssl/ssl_cert.c b/src/lib/libssl/ssl_cert.c index f2335d5650..c26df62c20 100644 --- a/src/lib/libssl/ssl_cert.c +++ b/src/lib/libssl/ssl_cert.c | |||
@@ -143,7 +143,7 @@ CERT *ssl_cert_new(void) | |||
143 | { | 143 | { |
144 | CERT *ret; | 144 | CERT *ret; |
145 | 145 | ||
146 | ret=(CERT *)Malloc(sizeof(CERT)); | 146 | ret=(CERT *)OPENSSL_malloc(sizeof(CERT)); |
147 | if (ret == NULL) | 147 | if (ret == NULL) |
148 | { | 148 | { |
149 | SSLerr(SSL_F_SSL_CERT_NEW,ERR_R_MALLOC_FAILURE); | 149 | SSLerr(SSL_F_SSL_CERT_NEW,ERR_R_MALLOC_FAILURE); |
@@ -162,7 +162,7 @@ CERT *ssl_cert_dup(CERT *cert) | |||
162 | CERT *ret; | 162 | CERT *ret; |
163 | int i; | 163 | int i; |
164 | 164 | ||
165 | ret = (CERT *)Malloc(sizeof(CERT)); | 165 | ret = (CERT *)OPENSSL_malloc(sizeof(CERT)); |
166 | if (ret == NULL) | 166 | if (ret == NULL) |
167 | { | 167 | { |
168 | SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_MALLOC_FAILURE); | 168 | SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_MALLOC_FAILURE); |
@@ -331,7 +331,7 @@ void ssl_cert_free(CERT *c) | |||
331 | EVP_PKEY_free(c->pkeys[i].publickey); | 331 | EVP_PKEY_free(c->pkeys[i].publickey); |
332 | #endif | 332 | #endif |
333 | } | 333 | } |
334 | Free(c); | 334 | OPENSSL_free(c); |
335 | } | 335 | } |
336 | 336 | ||
337 | int ssl_cert_inst(CERT **o) | 337 | int ssl_cert_inst(CERT **o) |
@@ -367,7 +367,7 @@ SESS_CERT *ssl_sess_cert_new(void) | |||
367 | { | 367 | { |
368 | SESS_CERT *ret; | 368 | SESS_CERT *ret; |
369 | 369 | ||
370 | ret = Malloc(sizeof *ret); | 370 | ret = OPENSSL_malloc(sizeof *ret); |
371 | if (ret == NULL) | 371 | if (ret == NULL) |
372 | { | 372 | { |
373 | SSLerr(SSL_F_SSL_SESS_CERT_NEW, ERR_R_MALLOC_FAILURE); | 373 | SSLerr(SSL_F_SSL_SESS_CERT_NEW, ERR_R_MALLOC_FAILURE); |
@@ -426,7 +426,7 @@ void ssl_sess_cert_free(SESS_CERT *sc) | |||
426 | DH_free(sc->peer_dh_tmp); | 426 | DH_free(sc->peer_dh_tmp); |
427 | #endif | 427 | #endif |
428 | 428 | ||
429 | Free(sc); | 429 | OPENSSL_free(sc); |
430 | } | 430 | } |
431 | 431 | ||
432 | int ssl_set_peer_cert_type(SESS_CERT *sc,int type) | 432 | int ssl_set_peer_cert_type(SESS_CERT *sc,int type) |
@@ -568,7 +568,7 @@ int SSL_CTX_add_client_CA(SSL_CTX *ctx,X509 *x) | |||
568 | return(add_client_CA(&(ctx->client_CA),x)); | 568 | return(add_client_CA(&(ctx->client_CA),x)); |
569 | } | 569 | } |
570 | 570 | ||
571 | static int xname_cmp(X509_NAME **a,X509_NAME **b) | 571 | static int xname_cmp(const X509_NAME * const *a, const X509_NAME * const *b) |
572 | { | 572 | { |
573 | return(X509_NAME_cmp(*a,*b)); | 573 | return(X509_NAME_cmp(*a,*b)); |
574 | } | 574 | } |
@@ -589,7 +589,7 @@ STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file) | |||
589 | X509_NAME *xn=NULL; | 589 | X509_NAME *xn=NULL; |
590 | STACK_OF(X509_NAME) *ret,*sk; | 590 | STACK_OF(X509_NAME) *ret,*sk; |
591 | 591 | ||
592 | ret=sk_X509_NAME_new(NULL); | 592 | ret=sk_X509_NAME_new_null(); |
593 | sk=sk_X509_NAME_new(xname_cmp); | 593 | sk=sk_X509_NAME_new(xname_cmp); |
594 | 594 | ||
595 | in=BIO_new(BIO_s_file_internal()); | 595 | in=BIO_new(BIO_s_file_internal()); |
@@ -644,53 +644,53 @@ err: | |||
644 | 644 | ||
645 | int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack, | 645 | int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack, |
646 | const char *file) | 646 | const char *file) |
647 | { | ||
648 | BIO *in; | ||
649 | X509 *x=NULL; | ||
650 | X509_NAME *xn=NULL; | ||
651 | int ret=1; | ||
652 | int (*oldcmp)(X509_NAME **a, X509_NAME **b); | ||
653 | |||
654 | oldcmp=sk_X509_NAME_set_cmp_func(stack,xname_cmp); | ||
655 | |||
656 | in=BIO_new(BIO_s_file_internal()); | ||
657 | |||
658 | if (in == NULL) | ||
659 | { | 647 | { |
660 | SSLerr(SSL_F_SSL_ADD_FILE_CERT_SUBJECTS_TO_STACK,ERR_R_MALLOC_FAILURE); | 648 | BIO *in; |
661 | goto err; | 649 | X509 *x=NULL; |
662 | } | 650 | X509_NAME *xn=NULL; |
651 | int ret=1; | ||
652 | int (*oldcmp)(const X509_NAME * const *a, const X509_NAME * const *b); | ||
663 | 653 | ||
664 | if (!BIO_read_filename(in,file)) | 654 | oldcmp=sk_X509_NAME_set_cmp_func(stack,xname_cmp); |
665 | goto err; | 655 | |
666 | 656 | in=BIO_new(BIO_s_file_internal()); | |
667 | for (;;) | 657 | |
668 | { | 658 | if (in == NULL) |
669 | if (PEM_read_bio_X509(in,&x,NULL,NULL) == NULL) | 659 | { |
670 | break; | 660 | SSLerr(SSL_F_SSL_ADD_FILE_CERT_SUBJECTS_TO_STACK,ERR_R_MALLOC_FAILURE); |
671 | if ((xn=X509_get_subject_name(x)) == NULL) goto err; | 661 | goto err; |
672 | xn=X509_NAME_dup(xn); | 662 | } |
673 | if (xn == NULL) goto err; | 663 | |
674 | if (sk_X509_NAME_find(stack,xn) >= 0) | 664 | if (!BIO_read_filename(in,file)) |
675 | X509_NAME_free(xn); | 665 | goto err; |
676 | else | 666 | |
677 | sk_X509_NAME_push(stack,xn); | 667 | for (;;) |
678 | } | 668 | { |
669 | if (PEM_read_bio_X509(in,&x,NULL,NULL) == NULL) | ||
670 | break; | ||
671 | if ((xn=X509_get_subject_name(x)) == NULL) goto err; | ||
672 | xn=X509_NAME_dup(xn); | ||
673 | if (xn == NULL) goto err; | ||
674 | if (sk_X509_NAME_find(stack,xn) >= 0) | ||
675 | X509_NAME_free(xn); | ||
676 | else | ||
677 | sk_X509_NAME_push(stack,xn); | ||
678 | } | ||
679 | 679 | ||
680 | if (0) | 680 | if (0) |
681 | { | 681 | { |
682 | err: | 682 | err: |
683 | ret=0; | 683 | ret=0; |
684 | } | 684 | } |
685 | if(in != NULL) | 685 | if(in != NULL) |
686 | BIO_free(in); | 686 | BIO_free(in); |
687 | if(x != NULL) | 687 | if(x != NULL) |
688 | X509_free(x); | 688 | X509_free(x); |
689 | 689 | ||
690 | sk_X509_NAME_set_cmp_func(stack,oldcmp); | 690 | sk_X509_NAME_set_cmp_func(stack,oldcmp); |
691 | 691 | ||
692 | return ret; | 692 | return ret; |
693 | } | 693 | } |
694 | 694 | ||
695 | /*! | 695 | /*! |
696 | * Add a directory of certs to a stack. | 696 | * Add a directory of certs to a stack. |
@@ -709,44 +709,46 @@ err: | |||
709 | 709 | ||
710 | int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack, | 710 | int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack, |
711 | const char *dir) | 711 | const char *dir) |
712 | { | ||
713 | DIR *d; | ||
714 | struct dirent *dstruct; | ||
715 | int ret = 0; | ||
716 | |||
717 | CRYPTO_w_lock(CRYPTO_LOCK_READDIR); | ||
718 | d = opendir(dir); | ||
719 | |||
720 | /* Note that a side effect is that the CAs will be sorted by name */ | ||
721 | if(!d) | ||
722 | { | 712 | { |
723 | SYSerr(SYS_F_OPENDIR, get_last_sys_error()); | 713 | DIR *d; |
724 | ERR_add_error_data(3, "opendir('", dir, "')"); | 714 | struct dirent *dstruct; |
725 | SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK, ERR_R_SYS_LIB); | 715 | int ret = 0; |
726 | goto err; | ||
727 | } | ||
728 | 716 | ||
729 | while((dstruct=readdir(d))) | 717 | CRYPTO_w_lock(CRYPTO_LOCK_READDIR); |
730 | { | 718 | d = opendir(dir); |
731 | char buf[1024]; | ||
732 | 719 | ||
733 | if(strlen(dir)+strlen(dstruct->d_name)+2 > sizeof buf) | 720 | /* Note that a side effect is that the CAs will be sorted by name */ |
734 | { | 721 | if(!d) |
735 | SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK,SSL_R_PATH_TOO_LONG); | 722 | { |
736 | goto err; | 723 | SYSerr(SYS_F_OPENDIR, get_last_sys_error()); |
737 | } | 724 | ERR_add_error_data(3, "opendir('", dir, "')"); |
725 | SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK, ERR_R_SYS_LIB); | ||
726 | goto err; | ||
727 | } | ||
738 | 728 | ||
739 | sprintf(buf,"%s/%s",dir,dstruct->d_name); | 729 | while((dstruct=readdir(d))) |
740 | if(!SSL_add_file_cert_subjects_to_stack(stack,buf)) | 730 | { |
741 | goto err; | 731 | char buf[1024]; |
742 | } | 732 | int r; |
743 | ret = 1; | 733 | |
734 | if(strlen(dir)+strlen(dstruct->d_name)+2 > sizeof buf) | ||
735 | { | ||
736 | SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK,SSL_R_PATH_TOO_LONG); | ||
737 | goto err; | ||
738 | } | ||
739 | |||
740 | r = BIO_snprintf(buf,sizeof buf,"%s/%s",dir,dstruct->d_name); | ||
741 | if (r <= 0 || r >= sizeof buf) | ||
742 | goto err; | ||
743 | if(!SSL_add_file_cert_subjects_to_stack(stack,buf)) | ||
744 | goto err; | ||
745 | } | ||
746 | ret = 1; | ||
744 | 747 | ||
745 | err: | 748 | err: |
746 | closedir(d); | 749 | CRYPTO_w_unlock(CRYPTO_LOCK_READDIR); |
747 | CRYPTO_w_unlock(CRYPTO_LOCK_READDIR); | 750 | return ret; |
748 | return ret; | 751 | } |
749 | } | ||
750 | 752 | ||
751 | #endif | 753 | #endif |
752 | #endif | 754 | #endif |