Commit 68dc6824 authored by Rich Salz's avatar Rich Salz
Browse files

In apps, malloc or die



No point in proceeding if you're out of memory.  So change
*all* OPENSSL_malloc calls in apps to use the new routine which
prints a message and exits.

Reviewed-by: default avatarRichard Levitte <levitte@openssl.org>
parent 222561fe
Loading
Loading
Loading
Loading
+19 −17
Original line number Diff line number Diff line
@@ -180,7 +180,7 @@ int chopup_args(ARGS *arg, char *buf)
    arg->argc = 0;
    if (arg->size == 0) {
        arg->size = 20;
        arg->argv = OPENSSL_malloc(sizeof(char *) * arg->size);
        arg->argv = app_malloc(sizeof(char *) * arg->size, "argv space");
        if (arg->argv == NULL)
            return 0;
    }
@@ -367,13 +367,7 @@ int password_callback(char *buf, int bufsiz, int verify, PW_CB_DATA *cb_tmp)
            ok = UI_add_input_string(ui, prompt, ui_flags, buf,
                                     PW_MIN_LENGTH, bufsiz - 1);
        if (ok >= 0 && verify) {
            buff = OPENSSL_malloc(bufsiz);
            if (!buff) {
                BIO_printf(bio_err, "Out of memory\n");
                UI_free(ui);
                OPENSSL_free(prompt);
                return 0;
            }
            buff = app_malloc(bufsiz, "password buffer");
            ok = UI_add_verify_string(ui, prompt, ui_flags, buff,
                                      PW_MIN_LENGTH, bufsiz - 1, buf);
        }
@@ -989,6 +983,21 @@ static int load_certs_crls(const char *file, int format,
    return rv;
}

void* app_malloc(int sz, const char *what)
{
    void *vp = OPENSSL_malloc(sz);

    if (vp == NULL) {
        BIO_printf(bio_err, "%s: Could not allocate %d bytes for %s\n",
                opt_getprog(), sz, what);
        ERR_print_errors(bio_err);
        exit(1);
    }
    return vp;
}



STACK_OF(X509) *load_certs(const char *file, int format,
                           const char *pass, ENGINE *e, const char *desc)
{
@@ -1585,11 +1594,7 @@ CA_DB *load_index(char *dbfile, DB_ATTR *db_attr)
        }
    }

    if ((retdb = OPENSSL_malloc(sizeof(CA_DB))) == NULL) {
        fprintf(stderr, "Out of memory\n");
        goto err;
    }

    retdb = app_malloc(sizeof *retdb, "new DB");
    retdb->db = tmpdb;
    tmpdb = NULL;
    if (db_attr)
@@ -2230,10 +2235,7 @@ unsigned char *next_protos_parse(unsigned short *outlen, const char *in)
    if (len >= 65535)
        return NULL;

    out = OPENSSL_malloc(strlen(in) + 1);
    if (!out)
        return NULL;

    out = app_malloc(strlen(in) + 1, "NPN buffer");
    for (i = 0; i <= len; ++i) {
        if (i == len || in[i] == ',') {
            if (i - start > 255) {
+1 −0
Original line number Diff line number Diff line
@@ -469,6 +469,7 @@ typedef struct ca_db_st {
    TXT_DB *db;
} CA_DB;

void* app_malloc(int sz, const char *what);
BIGNUM *load_serial(char *serialfile, int create, ASN1_INTEGER **retai);
int save_serial(char *serialfile, char *suffix, BIGNUM *serial,
                ASN1_INTEGER **retai);
+13 −51
Original line number Diff line number Diff line
@@ -491,21 +491,11 @@ end_of_options:
        const char *s = X509_get_default_cert_area();
        size_t len;

        len = strlen(s) + 1 + sizeof(CONFIG_FILE);
        tofree = app_malloc(len, "config filename");
#ifdef OPENSSL_SYS_VMS
        len = strlen(s) + sizeof(CONFIG_FILE);
        tofree = OPENSSL_malloc(len);
        if (!tofree) {
            BIO_printf(bio_err, "Out of memory\n");
            goto end;
        }
        strcpy(tofree, s);
#else
        len = strlen(s) + sizeof(CONFIG_FILE) + 1;
        tofree = OPENSSL_malloc(len);
        if (!tofree) {
            BIO_printf(bio_err, "Out of memory\n");
            goto end;
        }
        BUF_strlcpy(tofree, s, len);
        BUF_strlcat(tofree, "/", len);
#endif
@@ -1975,17 +1965,17 @@ static int do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509,
        goto end;

    /* We now just add it to the database */
    row[DB_type] = OPENSSL_malloc(2);
    row[DB_type] = app_malloc(2, "row db type");

    tm = X509_get_notAfter(ret);
    row[DB_exp_date] = OPENSSL_malloc(tm->length + 1);
    row[DB_exp_date] = app_malloc(tm->length + 1, "row expdate");
    memcpy(row[DB_exp_date], tm->data, tm->length);
    row[DB_exp_date][tm->length] = '\0';

    row[DB_rev_date] = NULL;

    /* row[DB_serial] done already */
    row[DB_file] = OPENSSL_malloc(8);
    row[DB_file] = app_malloc(8, "row file");
    row[DB_name] = X509_NAME_oneline(X509_get_subject_name(ret), NULL, 0);

    if ((row[DB_type] == NULL) || (row[DB_exp_date] == NULL) ||
@@ -1997,11 +1987,7 @@ static int do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509,
    row[DB_type][0] = 'V';
    row[DB_type][1] = '\0';

    if ((irow = OPENSSL_malloc(sizeof(char *) * (DB_NUMBER + 1))) == NULL) {
        BIO_printf(bio_err, "Memory allocation failure\n");
        goto end;
    }

    irow = app_malloc(sizeof(char *) * (DB_NUMBER + 1), "row space");
    for (i = 0; i < DB_NUMBER; i++) {
        irow[i] = row[i];
        row[i] = NULL;
@@ -2223,34 +2209,25 @@ static int do_revoke(X509 *x509, CA_DB *db, int type, char *value)
                   row[DB_serial], row[DB_name]);

        /* We now just add it to the database */
        row[DB_type] = OPENSSL_malloc(2);
        row[DB_type] = app_malloc(2, "row type");

        tm = X509_get_notAfter(x509);
        row[DB_exp_date] = OPENSSL_malloc(tm->length + 1);
        row[DB_exp_date] = app_malloc(tm->length + 1, "row exp_data");
        memcpy(row[DB_exp_date], tm->data, tm->length);
        row[DB_exp_date][tm->length] = '\0';

        row[DB_rev_date] = NULL;

        /* row[DB_serial] done already */
        row[DB_file] = OPENSSL_malloc(8);
        row[DB_file] = app_malloc(8, "row filename");

        /* row[DB_name] done already */

        if ((row[DB_type] == NULL) || (row[DB_exp_date] == NULL) ||
            (row[DB_file] == NULL)) {
            BIO_printf(bio_err, "Memory allocation failure\n");
            goto end;
        }
        BUF_strlcpy(row[DB_file], "unknown", 8);
        row[DB_type][0] = 'V';
        row[DB_type][1] = '\0';

        if ((irow = OPENSSL_malloc(sizeof(char *) * (DB_NUMBER + 1))) == NULL) {
            BIO_printf(bio_err, "Memory allocation failure\n");
            goto end;
        }

        irow = app_malloc(sizeof(char *) * (DB_NUMBER + 1), "row ptr");
        for (i = 0; i < DB_NUMBER; i++) {
            irow[i] = row[i];
            row[i] = NULL;
@@ -2312,11 +2289,7 @@ static int get_certificate_status(const char *serial, CA_DB *db)
        row[i] = NULL;

    /* Malloc needed char spaces */
    row[DB_serial] = OPENSSL_malloc(strlen(serial) + 2);
    if (row[DB_serial] == NULL) {
        BIO_printf(bio_err, "Malloc failure\n");
        goto end;
    }
    row[DB_serial] = app_malloc(strlen(serial) + 2, "row serial#");

    if (strlen(serial) % 2) {
        /*
@@ -2385,11 +2358,7 @@ static int do_updatedb(CA_DB *db)

    /* get actual time and make a string */
    a_tm = X509_gmtime_adj(a_tm, 0);
    a_tm_s = OPENSSL_malloc(a_tm->length + 1);
    if (a_tm_s == NULL) {
        cnt = -1;
        goto end;
    }
    a_tm_s = (char *)OPENSSL_malloc(a_tm->length + 1);

    memcpy(a_tm_s, a_tm->data, a_tm->length);
    a_tm_s[a_tm->length] = '\0';
@@ -2429,11 +2398,8 @@ static int do_updatedb(CA_DB *db)
        }
    }

 end:

    ASN1_UTCTIME_free(a_tm);
    OPENSSL_free(a_tm_s);

    return (cnt);
}

@@ -2533,11 +2499,7 @@ char *make_revocation_str(int rev_type, char *rev_arg)
    if (other)
        i += strlen(other) + 1;

    str = OPENSSL_malloc(i);

    if (!str)
        return NULL;

    str = app_malloc(i, "revocation reason");
    BUF_strlcpy(str, (char *)revtm->data, i);
    if (reason) {
        BUF_strlcat(str, ",", i);
+1 −5
Original line number Diff line number Diff line
@@ -570,11 +570,7 @@ int cms_main(int argc, char **argv)
            }
            if (key_param == NULL || key_param->idx != keyidx) {
                cms_key_param *nparam;
                nparam = OPENSSL_malloc(sizeof(cms_key_param));
                if (!nparam) {
                    BIO_printf(bio_err, "Out of memory\n");
                    goto end;
                }
                nparam = app_malloc(sizeof *nparam, "key param buffer");
                nparam->idx = keyidx;
                if ((nparam->param = sk_OPENSSL_STRING_new_null()) == NULL)
                    goto end;
+2 −9
Original line number Diff line number Diff line
@@ -139,10 +139,7 @@ int dgst_main(int argc, char **argv)
    int engine_impl = 0;

    prog = opt_progname(argv[0]);
    if ((buf = OPENSSL_malloc(BUFSIZE)) == NULL) {
        BIO_printf(bio_err, "%s: out of memory\n", prog);
        goto end;
    }
    buf = app_malloc(BUFSIZE, "I/O buffer");
    md = EVP_get_digestbyname(prog);

    prog = opt_init(argc, argv, dgst_options);
@@ -394,11 +391,7 @@ int dgst_main(int argc, char **argv)
            goto end;
        }
        siglen = EVP_PKEY_size(sigkey);
        sigbuf = OPENSSL_malloc(siglen);
        if (!sigbuf) {
            BIO_printf(bio_err, "Out of memory\n");
            goto end;
        }
        sigbuf = app_malloc(siglen, "signature buffer");
        siglen = BIO_read(sigbio, sigbuf, siglen);
        BIO_free(sigbio);
        if (siglen <= 0) {
Loading