diff options
-rw-r--r-- | src/usr.bin/openssl/pkcs12.c | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/src/usr.bin/openssl/pkcs12.c b/src/usr.bin/openssl/pkcs12.c index 69e230eff9..1407a96e03 100644 --- a/src/usr.bin/openssl/pkcs12.c +++ b/src/usr.bin/openssl/pkcs12.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: pkcs12.c,v 1.28 2024/08/22 12:14:33 tb Exp $ */ | 1 | /* $OpenBSD: pkcs12.c,v 1.29 2024/12/26 14:10:48 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. | 3 | * project. |
4 | */ | 4 | */ |
@@ -653,8 +653,16 @@ pkcs12_main(int argc, char **argv) | |||
653 | cfg.certfile, FORMAT_PEM, NULL, | 653 | cfg.certfile, FORMAT_PEM, NULL, |
654 | "certificates from certfile")) == NULL) | 654 | "certificates from certfile")) == NULL) |
655 | goto export_end; | 655 | goto export_end; |
656 | while (sk_X509_num(morecerts) > 0) | 656 | while (sk_X509_num(morecerts) > 0) { |
657 | sk_X509_push(certs, sk_X509_shift(morecerts)); | 657 | X509 *cert = sk_X509_shift(morecerts); |
658 | |||
659 | if (!sk_X509_push(certs, cert)) { | ||
660 | X509_free(cert); | ||
661 | sk_X509_pop_free(morecerts, X509_free); | ||
662 | goto export_end; | ||
663 | } | ||
664 | } | ||
665 | |||
658 | sk_X509_free(morecerts); | 666 | sk_X509_free(morecerts); |
659 | } | 667 | } |
660 | 668 | ||
@@ -678,11 +686,18 @@ pkcs12_main(int argc, char **argv) | |||
678 | 686 | ||
679 | if (vret == X509_V_OK) { | 687 | if (vret == X509_V_OK) { |
680 | /* Exclude verified certificate */ | 688 | /* Exclude verified certificate */ |
681 | for (i = 1; i < sk_X509_num(chain2); i++) | 689 | X509_free(sk_X509_shift(chain2)); |
682 | sk_X509_push(certs, sk_X509_value( | 690 | |
683 | chain2, i)); | 691 | while (sk_X509_num(chain2) > 0) { |
684 | /* Free first certificate */ | 692 | X509 *cert = sk_X509_shift(chain2); |
685 | X509_free(sk_X509_value(chain2, 0)); | 693 | |
694 | if (!sk_X509_push(certs, cert)) { | ||
695 | X509_free(cert); | ||
696 | sk_X509_pop_free(chain2, | ||
697 | X509_free); | ||
698 | goto export_end; | ||
699 | } | ||
700 | } | ||
686 | sk_X509_free(chain2); | 701 | sk_X509_free(chain2); |
687 | } else { | 702 | } else { |
688 | if (vret != X509_V_ERR_UNSPECIFIED) | 703 | if (vret != X509_V_ERR_UNSPECIFIED) |
@@ -692,6 +707,7 @@ pkcs12_main(int argc, char **argv) | |||
692 | vret)); | 707 | vret)); |
693 | else | 708 | else |
694 | ERR_print_errors(bio_err); | 709 | ERR_print_errors(bio_err); |
710 | sk_X509_pop_free(chain2, X509_free); | ||
695 | goto export_end; | 711 | goto export_end; |
696 | } | 712 | } |
697 | } | 713 | } |