summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorinoguchi <>2021-08-28 02:11:18 +0000
committerinoguchi <>2021-08-28 02:11:18 +0000
commitce5b47f96895cf54d0b04da168801c91c8a99e93 (patch)
tree648e2c5327c8ed01151ab508223ebb88b35f166d /src
parenta1a6a093d1a890b18821701c464e83e40b1baa7a (diff)
downloadopenbsd-ce5b47f96895cf54d0b04da168801c91c8a99e93.tar.gz
openbsd-ce5b47f96895cf54d0b04da168801c91c8a99e93.tar.bz2
openbsd-ce5b47f96895cf54d0b04da168801c91c8a99e93.zip
Checking the return value in openssl(1) ca.c
Some functions are used without verifying the return value in openssl(1) ca. This diff adds checking for the function return value. With this diff, I changed return value of the write_new_certificate from void to int to return the condition to the caller. ok and comments from tb@
Diffstat (limited to 'src')
-rw-r--r--src/usr.bin/openssl/ca.c168
1 files changed, 127 insertions, 41 deletions
diff --git a/src/usr.bin/openssl/ca.c b/src/usr.bin/openssl/ca.c
index 86efbdb657..dbdd43c6a7 100644
--- a/src/usr.bin/openssl/ca.c
+++ b/src/usr.bin/openssl/ca.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ca.c,v 1.35 2021/07/24 13:21:04 inoguchi Exp $ */ 1/* $OpenBSD: ca.c,v 1.36 2021/08/28 02:11:18 inoguchi 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 *
@@ -141,7 +141,7 @@ static int certify_spkac(X509 **xret, char *infile, EVP_PKEY *pkey,
141 unsigned long chtype, int multirdn, int email_dn, char *startdate, 141 unsigned long chtype, int multirdn, int email_dn, char *startdate,
142 char *enddate, long days, char *ext_sect, CONF *conf, int verbose, 142 char *enddate, long days, char *ext_sect, CONF *conf, int verbose,
143 unsigned long certopt, unsigned long nameopt, int default_op, int ext_copy); 143 unsigned long certopt, unsigned long nameopt, int default_op, int ext_copy);
144static void write_new_certificate(BIO *bp, X509 *x, int output_der, 144static int write_new_certificate(BIO *bp, X509 *x, int output_der,
145 int notext); 145 int notext);
146static int do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509, 146static int do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509,
147 const EVP_MD *dgst, STACK_OF(OPENSSL_STRING) *sigopts, 147 const EVP_MD *dgst, STACK_OF(OPENSSL_STRING) *sigopts,
@@ -1065,6 +1065,8 @@ ca_main(int argc, char **argv)
1065 goto err; 1065 goto err;
1066 } 1066 }
1067 ca_config.md = (char *) OBJ_nid2sn(def_nid); 1067 ca_config.md = (char *) OBJ_nid2sn(def_nid);
1068 if (ca_config.md == NULL)
1069 goto err;
1068 } 1070 }
1069 if ((dgst = EVP_get_digestbyname(ca_config.md)) == NULL) { 1071 if ((dgst = EVP_get_digestbyname(ca_config.md)) == NULL) {
1070 BIO_printf(bio_err, 1072 BIO_printf(bio_err,
@@ -1350,9 +1352,12 @@ ca_main(int argc, char **argv)
1350 perror(pempath); 1352 perror(pempath);
1351 goto err; 1353 goto err;
1352 } 1354 }
1353 write_new_certificate(Cout, x, 0, ca_config.notext); 1355 if (!write_new_certificate(Cout, x, 0,
1354 write_new_certificate(Sout, x, output_der, 1356 ca_config.notext))
1355 ca_config.notext); 1357 goto err;
1358 if (!write_new_certificate(Sout, x, output_der,
1359 ca_config.notext))
1360 goto err;
1356 } 1361 }
1357 1362
1358 if (sk_X509_num(cert_sk)) { 1363 if (sk_X509_num(cert_sk)) {
@@ -1423,16 +1428,25 @@ ca_main(int argc, char **argv)
1423 tmptm = ASN1_TIME_new(); 1428 tmptm = ASN1_TIME_new();
1424 if (tmptm == NULL) 1429 if (tmptm == NULL)
1425 goto err; 1430 goto err;
1426 X509_gmtime_adj(tmptm, 0); 1431 if (X509_gmtime_adj(tmptm, 0) == NULL) {
1427 X509_CRL_set_lastUpdate(crl, tmptm); 1432 ASN1_TIME_free(tmptm);
1433 goto err;
1434 }
1435 if (!X509_CRL_set_lastUpdate(crl, tmptm)) {
1436 ASN1_TIME_free(tmptm);
1437 goto err;
1438 }
1428 if (X509_time_adj_ex(tmptm, ca_config.crldays, 1439 if (X509_time_adj_ex(tmptm, ca_config.crldays,
1429 ca_config.crlhours * 60 * 60 + ca_config.crlsec, NULL) == 1440 ca_config.crlhours * 60 * 60 + ca_config.crlsec, NULL) ==
1430 NULL) { 1441 NULL) {
1431 BIO_puts(bio_err, "error setting CRL nextUpdate\n"); 1442 BIO_puts(bio_err, "error setting CRL nextUpdate\n");
1443 ASN1_TIME_free(tmptm);
1444 goto err;
1445 }
1446 if (!X509_CRL_set_nextUpdate(crl, tmptm)) {
1447 ASN1_TIME_free(tmptm);
1432 goto err; 1448 goto err;
1433 } 1449 }
1434 X509_CRL_set_nextUpdate(crl, tmptm);
1435
1436 ASN1_TIME_free(tmptm); 1450 ASN1_TIME_free(tmptm);
1437 1451
1438 for (i = 0; i < sk_OPENSSL_PSTRING_num(db->db->data); i++) { 1452 for (i = 0; i < sk_OPENSSL_PSTRING_num(db->db->data); i++) {
@@ -1452,9 +1466,13 @@ ca_main(int argc, char **argv)
1452 serial = NULL; 1466 serial = NULL;
1453 if (tmpserial == NULL) 1467 if (tmpserial == NULL)
1454 goto err; 1468 goto err;
1455 X509_REVOKED_set_serialNumber(r, tmpserial); 1469 if (!X509_REVOKED_set_serialNumber(r, tmpserial)) {
1470 ASN1_INTEGER_free(tmpserial);
1471 goto err;
1472 }
1456 ASN1_INTEGER_free(tmpserial); 1473 ASN1_INTEGER_free(tmpserial);
1457 X509_CRL_add0_revoked(crl, r); 1474 if (!X509_CRL_add0_revoked(crl, r))
1475 goto err;
1458 } 1476 }
1459 } 1477 }
1460 1478
@@ -1482,8 +1500,11 @@ ca_main(int argc, char **argv)
1482 tmpserial = BN_to_ASN1_INTEGER(crlnumber, NULL); 1500 tmpserial = BN_to_ASN1_INTEGER(crlnumber, NULL);
1483 if (tmpserial == NULL) 1501 if (tmpserial == NULL)
1484 goto err; 1502 goto err;
1485 X509_CRL_add1_ext_i2d(crl, NID_crl_number, 1503 if (!X509_CRL_add1_ext_i2d(crl, NID_crl_number,
1486 tmpserial, 0, 0); 1504 tmpserial, 0, 0)) {
1505 ASN1_INTEGER_free(tmpserial);
1506 goto err;
1507 }
1487 ASN1_INTEGER_free(tmpserial); 1508 ASN1_INTEGER_free(tmpserial);
1488 crl_v2 = 1; 1509 crl_v2 = 1;
1489 if (!BN_add_word(crlnumber, 1)) 1510 if (!BN_add_word(crlnumber, 1))
@@ -1507,7 +1528,8 @@ ca_main(int argc, char **argv)
1507 ca_config.sigopts)) 1528 ca_config.sigopts))
1508 goto err; 1529 goto err;
1509 1530
1510 PEM_write_bio_X509_CRL(Sout, crl); 1531 if (!PEM_write_bio_X509_CRL(Sout, crl))
1532 goto err;
1511 1533
1512 if (crlnumberfile != NULL) /* Rename the crlnumber file */ 1534 if (crlnumberfile != NULL) /* Rename the crlnumber file */
1513 if (!rotate_serial(crlnumberfile, "new", "old")) 1535 if (!rotate_serial(crlnumberfile, "new", "old"))
@@ -1605,8 +1627,10 @@ certify(X509 **xret, char *infile, EVP_PKEY *pkey, X509 *x509,
1605 infile); 1627 infile);
1606 goto err; 1628 goto err;
1607 } 1629 }
1608 if (verbose) 1630 if (verbose) {
1609 X509_REQ_print(bio_err, req); 1631 if (!X509_REQ_print(bio_err, req))
1632 goto err;
1633 }
1610 1634
1611 BIO_printf(bio_err, "Check that the request matches the signature\n"); 1635 BIO_printf(bio_err, "Check that the request matches the signature\n");
1612 1636
@@ -1665,8 +1689,10 @@ certify_cert(X509 **xret, char *infile, EVP_PKEY *pkey, X509 *x509,
1665 if ((req = load_cert(bio_err, infile, FORMAT_PEM, NULL, 1689 if ((req = load_cert(bio_err, infile, FORMAT_PEM, NULL,
1666 infile)) == NULL) 1690 infile)) == NULL)
1667 goto err; 1691 goto err;
1668 if (verbose) 1692 if (verbose) {
1669 X509_print(bio_err, req); 1693 if (!X509_print(bio_err, req))
1694 goto err;
1695 }
1670 1696
1671 BIO_printf(bio_err, "Check that the request matches the signature\n"); 1697 BIO_printf(bio_err, "Check that the request matches the signature\n");
1672 1698
@@ -1746,7 +1772,10 @@ do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509, const EVP_MD *dgst,
1746 ERR_print_errors(bio_err); 1772 ERR_print_errors(bio_err);
1747 goto err; 1773 goto err;
1748 } 1774 }
1749 X509_REQ_set_subject_name(req, n); 1775 if (!X509_REQ_set_subject_name(req, n)) {
1776 X509_NAME_free(n);
1777 goto err;
1778 }
1750 req->req_info->enc.modified = 1; 1779 req->req_info->enc.modified = 1;
1751 X509_NAME_free(n); 1780 X509_NAME_free(n);
1752 } 1781 }
@@ -1757,12 +1786,20 @@ do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509, const EVP_MD *dgst,
1757 name = X509_REQ_get_subject_name(req); 1786 name = X509_REQ_get_subject_name(req);
1758 for (i = 0; i < X509_NAME_entry_count(name); i++) { 1787 for (i = 0; i < X509_NAME_entry_count(name); i++) {
1759 ne = X509_NAME_get_entry(name, i); 1788 ne = X509_NAME_get_entry(name, i);
1789 if (ne == NULL)
1790 goto err;
1760 str = X509_NAME_ENTRY_get_data(ne); 1791 str = X509_NAME_ENTRY_get_data(ne);
1792 if (str == NULL)
1793 goto err;
1761 obj = X509_NAME_ENTRY_get_object(ne); 1794 obj = X509_NAME_ENTRY_get_object(ne);
1795 if (obj == NULL)
1796 goto err;
1762 1797
1763 if (ca_config.msie_hack) { 1798 if (ca_config.msie_hack) {
1764 /* assume all type should be strings */ 1799 /* assume all type should be strings */
1765 nid = OBJ_obj2nid(ne->object); 1800 nid = OBJ_obj2nid(ne->object);
1801 if (nid == NID_undef)
1802 goto err;
1766 1803
1767 if (str->type == V_ASN1_UNIVERSALSTRING) 1804 if (str->type == V_ASN1_UNIVERSALSTRING)
1768 ASN1_UNIVERSALSTRING_to_string(str); 1805 ASN1_UNIVERSALSTRING_to_string(str);
@@ -1825,6 +1862,8 @@ do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509, const EVP_MD *dgst,
1825 goto err; 1862 goto err;
1826 } 1863 }
1827 obj = OBJ_nid2obj(j); 1864 obj = OBJ_nid2obj(j);
1865 if (obj == NULL)
1866 goto err;
1828 1867
1829 last = -1; 1868 last = -1;
1830 for (;;) { 1869 for (;;) {
@@ -1836,6 +1875,8 @@ do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509, const EVP_MD *dgst,
1836 tne = NULL; 1875 tne = NULL;
1837 } else { 1876 } else {
1838 tne = X509_NAME_get_entry(name, j); 1877 tne = X509_NAME_get_entry(name, j);
1878 if (tne == NULL)
1879 goto err;
1839 } 1880 }
1840 last = j; 1881 last = j;
1841 1882
@@ -1874,8 +1915,14 @@ do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509, const EVP_MD *dgst,
1874 } 1915 }
1875 if (j >= 0) { 1916 if (j >= 0) {
1876 push = X509_NAME_get_entry(CAname, j); 1917 push = X509_NAME_get_entry(CAname, j);
1918 if (push == NULL)
1919 goto err;
1877 str = X509_NAME_ENTRY_get_data(tne); 1920 str = X509_NAME_ENTRY_get_data(tne);
1921 if (str == NULL)
1922 goto err;
1878 str2 = X509_NAME_ENTRY_get_data(push); 1923 str2 = X509_NAME_ENTRY_get_data(push);
1924 if (str2 == NULL)
1925 goto err;
1879 last2 = j; 1926 last2 = j;
1880 if (ASN1_STRING_cmp(str, str2) != 0) 1927 if (ASN1_STRING_cmp(str, str2) != 0)
1881 goto again2; 1928 goto again2;
@@ -1943,7 +1990,12 @@ do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509, const EVP_MD *dgst,
1943 while ((i = X509_NAME_get_index_by_NID(dn_subject, 1990 while ((i = X509_NAME_get_index_by_NID(dn_subject,
1944 NID_pkcs9_emailAddress, -1)) >= 0) { 1991 NID_pkcs9_emailAddress, -1)) >= 0) {
1945 tmpne = X509_NAME_get_entry(dn_subject, i); 1992 tmpne = X509_NAME_get_entry(dn_subject, i);
1946 X509_NAME_delete_entry(dn_subject, i); 1993 if (tmpne == NULL)
1994 goto err;
1995 if (X509_NAME_delete_entry(dn_subject, i) == NULL) {
1996 X509_NAME_ENTRY_free(tmpne);
1997 goto err;
1998 }
1947 X509_NAME_ENTRY_free(tmpne); 1999 X509_NAME_ENTRY_free(tmpne);
1948 } 2000 }
1949 } 2001 }
@@ -2039,17 +2091,20 @@ do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509, const EVP_MD *dgst,
2039 goto err; 2091 goto err;
2040 } 2092 }
2041 2093
2042 if (strcmp(startdate, "today") == 0) 2094 if (strcmp(startdate, "today") == 0) {
2043 X509_gmtime_adj(X509_get_notBefore(ret), 0); 2095 if (X509_gmtime_adj(X509_get_notBefore(ret), 0) == NULL)
2044 else if (setCertificateTime(X509_get_notBefore(ret), startdate) == -1) { 2096 goto err;
2097 } else if (setCertificateTime(X509_get_notBefore(ret), startdate) == -1) {
2045 BIO_printf(bio_err, "Invalid start date %s\n", 2098 BIO_printf(bio_err, "Invalid start date %s\n",
2046 startdate); 2099 startdate);
2047 goto err; 2100 goto err;
2048 } 2101 }
2049 2102
2050 if (enddate == NULL) 2103 if (enddate == NULL) {
2051 X509_time_adj_ex(X509_get_notAfter(ret), days, 0, NULL); 2104 if (X509_time_adj_ex(X509_get_notAfter(ret), days, 0,
2052 else if (setCertificateTime(X509_get_notAfter(ret), enddate) == -1) { 2105 NULL) == NULL)
2106 goto err;
2107 } else if (setCertificateTime(X509_get_notAfter(ret), enddate) == -1) {
2053 BIO_printf(bio_err, "Invalid end date %s\n", 2108 BIO_printf(bio_err, "Invalid end date %s\n",
2054 enddate); 2109 enddate);
2055 goto err; 2110 goto err;
@@ -2059,6 +2114,9 @@ do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509, const EVP_MD *dgst,
2059 goto err; 2114 goto err;
2060 2115
2061 pktmp = X509_REQ_get_pubkey(req); 2116 pktmp = X509_REQ_get_pubkey(req);
2117 if (pktmp == NULL)
2118 goto err;
2119
2062 i = X509_set_pubkey(ret, pktmp); 2120 i = X509_set_pubkey(ret, pktmp);
2063 EVP_PKEY_free(pktmp); 2121 EVP_PKEY_free(pktmp);
2064 if (!i) 2122 if (!i)
@@ -2070,7 +2128,10 @@ do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509, const EVP_MD *dgst,
2070 if (ci->version == NULL) 2128 if (ci->version == NULL)
2071 if ((ci->version = ASN1_INTEGER_new()) == NULL) 2129 if ((ci->version = ASN1_INTEGER_new()) == NULL)
2072 goto err; 2130 goto err;
2073 ASN1_INTEGER_set(ci->version, 2); /* version 3 certificate */ 2131
2132 /* version 3 certificate */
2133 if (!ASN1_INTEGER_set(ci->version, 2))
2134 goto err;
2074 2135
2075 /* 2136 /*
2076 * Free the current entries if any, there should not be any I 2137 * Free the current entries if any, there should not be any I
@@ -2146,7 +2207,8 @@ do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509, const EVP_MD *dgst,
2146 * present 2207 * present
2147 */ 2208 */
2148 certopt |= X509_FLAG_NO_SIGDUMP | X509_FLAG_NO_SIGNAME; 2209 certopt |= X509_FLAG_NO_SIGDUMP | X509_FLAG_NO_SIGNAME;
2149 X509_print_ex(bio_err, ret, nameopt, certopt); 2210 if (!X509_print_ex(bio_err, ret, nameopt, certopt))
2211 goto err;
2150 } 2212 }
2151 BIO_printf(bio_err, "Certificate is to be certified until "); 2213 BIO_printf(bio_err, "Certificate is to be certified until ");
2152 ASN1_TIME_print(bio_err, X509_get_notAfter(ret)); 2214 ASN1_TIME_print(bio_err, X509_get_notAfter(ret));
@@ -2172,10 +2234,18 @@ do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509, const EVP_MD *dgst,
2172 goto err; 2234 goto err;
2173 } 2235 }
2174 } 2236 }
2237
2175 pktmp = X509_get_pubkey(ret); 2238 pktmp = X509_get_pubkey(ret);
2239 if (pktmp == NULL)
2240 goto err;
2241
2176 if (EVP_PKEY_missing_parameters(pktmp) && 2242 if (EVP_PKEY_missing_parameters(pktmp) &&
2177 !EVP_PKEY_missing_parameters(pkey)) 2243 !EVP_PKEY_missing_parameters(pkey)) {
2178 EVP_PKEY_copy_parameters(pktmp, pkey); 2244 if (!EVP_PKEY_copy_parameters(pktmp, pkey)) {
2245 EVP_PKEY_free(pktmp);
2246 goto err;
2247 }
2248 }
2179 EVP_PKEY_free(pktmp); 2249 EVP_PKEY_free(pktmp);
2180 2250
2181 if (!do_X509_sign(bio_err, ret, pkey, dgst, sigopts)) 2251 if (!do_X509_sign(bio_err, ret, pkey, dgst, sigopts))
@@ -2247,16 +2317,19 @@ do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509, const EVP_MD *dgst,
2247 return (ok); 2317 return (ok);
2248} 2318}
2249 2319
2250static void 2320static int
2251write_new_certificate(BIO *bp, X509 *x, int output_der, int notext) 2321write_new_certificate(BIO *bp, X509 *x, int output_der, int notext)
2252{ 2322{
2253 if (output_der) { 2323 if (output_der) {
2254 (void) i2d_X509_bio(bp, x); 2324 if (!i2d_X509_bio(bp, x))
2255 return; 2325 return (0);
2256 } 2326 }
2257 if (!notext) 2327 if (!notext) {
2258 X509_print(bp, x); 2328 if (!X509_print(bp, x))
2259 PEM_write_bio_X509(bp, x); 2329 return (0);
2330 }
2331
2332 return PEM_write_bio_X509(bp, x);
2260} 2333}
2261 2334
2262static int 2335static int
@@ -2377,7 +2450,10 @@ certify_spkac(X509 **xret, char *infile, EVP_PKEY *pkey, X509 *x509,
2377 } 2450 }
2378 BIO_printf(bio_err, "Signature ok\n"); 2451 BIO_printf(bio_err, "Signature ok\n");
2379 2452
2380 X509_REQ_set_pubkey(req, pktmp); 2453 if (!X509_REQ_set_pubkey(req, pktmp)) {
2454 EVP_PKEY_free(pktmp);
2455 goto err;
2456 }
2381 EVP_PKEY_free(pktmp); 2457 EVP_PKEY_free(pktmp);
2382 ok = do_body(xret, pkey, x509, dgst, sigopts, policy, db, serial, 2458 ok = do_body(xret, pkey, x509, dgst, sigopts, policy, db, serial,
2383 subj, chtype, multirdn, email_dn, startdate, enddate, days, 1, 2459 subj, chtype, multirdn, email_dn, startdate, enddate, days, 1,
@@ -2591,12 +2667,20 @@ do_updatedb(CA_DB *db)
2591 ASN1_UTCTIME *a_tm = NULL; 2667 ASN1_UTCTIME *a_tm = NULL;
2592 int i, cnt = 0; 2668 int i, cnt = 0;
2593 int db_y2k, a_y2k; /* flags = 1 if y >= 2000 */ 2669 int db_y2k, a_y2k; /* flags = 1 if y >= 2000 */
2594 char **rrow, *a_tm_s; 2670 char **rrow, *a_tm_s = NULL;
2595 2671
2596 a_tm = ASN1_UTCTIME_new(); 2672 a_tm = ASN1_UTCTIME_new();
2673 if (a_tm == NULL) {
2674 cnt = -1;
2675 goto err;
2676 }
2597 2677
2598 /* get actual time and make a string */ 2678 /* get actual time and make a string */
2599 a_tm = X509_gmtime_adj(a_tm, 0); 2679 a_tm = X509_gmtime_adj(a_tm, 0);
2680 if (a_tm == NULL) {
2681 cnt = -1;
2682 goto err;
2683 }
2600 a_tm_s = malloc(a_tm->length + 1); 2684 a_tm_s = malloc(a_tm->length + 1);
2601 if (a_tm_s == NULL) { 2685 if (a_tm_s == NULL) {
2602 cnt = -1; 2686 cnt = -1;
@@ -2701,7 +2785,6 @@ make_revocation_str(int rev_type, char *rev_arg)
2701 2785
2702 case REV_HOLD: 2786 case REV_HOLD:
2703 /* Argument is an OID */ 2787 /* Argument is an OID */
2704
2705 otmp = OBJ_txt2obj(rev_arg, 0); 2788 otmp = OBJ_txt2obj(rev_arg, 0);
2706 ASN1_OBJECT_free(otmp); 2789 ASN1_OBJECT_free(otmp);
2707 2790
@@ -2716,7 +2799,6 @@ make_revocation_str(int rev_type, char *rev_arg)
2716 2799
2717 case REV_KEY_COMPROMISE: 2800 case REV_KEY_COMPROMISE:
2718 case REV_CA_COMPROMISE: 2801 case REV_CA_COMPROMISE:
2719
2720 /* Argument is the key compromise time */ 2802 /* Argument is the key compromise time */
2721 if (!ASN1_GENERALIZEDTIME_set_string(NULL, rev_arg)) { 2803 if (!ASN1_GENERALIZEDTIME_set_string(NULL, rev_arg)) {
2722 BIO_printf(bio_err, 2804 BIO_printf(bio_err,
@@ -2731,15 +2813,19 @@ make_revocation_str(int rev_type, char *rev_arg)
2731 reason = "CAkeyTime"; 2813 reason = "CAkeyTime";
2732 2814
2733 break; 2815 break;
2734
2735 } 2816 }
2736 2817
2737 revtm = X509_gmtime_adj(NULL, 0); 2818 revtm = X509_gmtime_adj(NULL, 0);
2819 if (revtm == NULL)
2820 return NULL;
2821
2738 if (asprintf(&str, "%s%s%s%s%s", revtm->data, 2822 if (asprintf(&str, "%s%s%s%s%s", revtm->data,
2739 reason ? "," : "", reason ? reason : "", 2823 reason ? "," : "", reason ? reason : "",
2740 other ? "," : "", other ? other : "") == -1) 2824 other ? "," : "", other ? other : "") == -1)
2741 str = NULL; 2825 str = NULL;
2826
2742 ASN1_UTCTIME_free(revtm); 2827 ASN1_UTCTIME_free(revtm);
2828
2743 return str; 2829 return str;
2744} 2830}
2745 2831