diff options
Diffstat (limited to '')
| -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 |
