Hello,

I've gone through lib/libssl/src/apps with the goal of making {m,c,re}alloc
uses more idiomatic, adding error checking in some places where missing,
and some minor style unification.

Feedback appreciated, better patches to come after the semester ends.


Index: apps.c
===================================================================
RCS file: /cvs/src/lib/libssl/src/apps/apps.c,v
retrieving revision 1.45
diff -u -p -r1.45 apps.c
--- apps.c      3 May 2014 16:03:54 -0000       1.45
+++ apps.c      4 May 2014 06:07:45 -0000
@@ -209,13 +209,12 @@ chopup_args(ARGS * arg, char *buf, int *
        *argc = 0;
        *argv = NULL;
 
-       i = 0;
        if (arg->count == 0) {
                arg->count = 20;
-               arg->data = (char **)malloc(sizeof(char *) * arg->count);
+               arg->data = calloc(arg->count, sizeof(char *));
+               if (arg->data == NULL)
+                       return 0;
        }
-       for (i = 0; i < arg->count; i++)
-               arg->data[i] = NULL;
 
        num = 0;
        p = buf;
@@ -232,8 +231,7 @@ chopup_args(ARGS * arg, char *buf, int *
                if (num >= arg->count) {
                        char **tmp_p;
                        int tlen = arg->count + 20;
-                       tmp_p = (char **) realloc(arg->data,
-                           sizeof(char *) * tlen);
+                       tmp_p = reallocarray(arg->data, tlen, sizeof(char *));
                        if (tmp_p == NULL)
                                return 0;
                        arg->data = tmp_p;
@@ -266,7 +264,7 @@ chopup_args(ARGS * arg, char *buf, int *
        }
        *argc = num;
        *argv = arg->data;
-       return (1);
+       return 1;
 }
 
 int
@@ -404,7 +402,28 @@ password_callback(char *buf, int bufsiz,
                        ok = UI_add_input_string(ui, prompt, ui_flags, buf,
                            PW_MIN_LENGTH, bufsiz - 1);
                if (ok >= 0 && verify) {
-                       buff = (char *) malloc(bufsiz);
+                       buff = malloc(bufsiz);
+                       /*
+                        * NULL returns appear to be handled by the following:
+                        *
+                        * UI_add_verify_string(x, x, x, buff=NULL, x, x, x) ->
+                        *   general_allocate_string(x, x, x, UIT_VERIFY, x, \
+                        *   result_buf=NULL, x, x, x) ->
+                        *     general_allocate_prompt(x, x, x, x, x, NULL) ->
+                        *       ret = NULL;
+                        *       if (type == UIT_VERIFY && result_buf == NULL)
+                        *         UIerr(...); and dont touch ret
+                        *     returns NULL
+                        *   returns -1
+                        * returns -1
+                        *
+                        * So, we /should/ (maybe) be good. Not calling UIerr()
+                        * could very well have some well-hidden side-effects
+                        * that I would definitly not notice myself, so I'll
+                        * leave this as is without an explicit check here.
+                        * Maybe somebody who knows better than I has a better
+                        * suggestion?
+                        */
                        ok = UI_add_verify_string(ui, prompt, ui_flags, buff,
                            PW_MIN_LENGTH, bufsiz - 1, buf);
                }
@@ -1830,26 +1849,30 @@ parse_yesno(const char *str, int def)
 X509_NAME *
 parse_name(char *subject, long chtype, int multirdn)
 {
-       size_t buflen = strlen(subject) + 1;    /* to copy the types and
-                                                * values into. due to
-                                                * escaping, the copy can
-                                                * only become shorter */
-       char *buf = malloc(buflen);
-       size_t max_ne = buflen / 2 + 1; /* maximum number of name elements */
-       char **ne_types = malloc(max_ne * sizeof(char *));
-       char **ne_values = malloc(max_ne * sizeof(char *));
-       int *mval = malloc(max_ne * sizeof(int));
+       size_t buflen, max_ne;
+       char **ne_types, **ne_values, *buf, *sp, *bp;
+       int *mval, i, nid, ne_num = 0;
+       X509_NAME *n = NULL;
 
-       char *sp = subject, *bp = buf;
-       int i, ne_num = 0;
+       /* Due to escaping, buf can never be bigger than subject. */
+       buflen = strlen(subject + 1);
 
-       X509_NAME *n = NULL;
-       int nid;
+       /* maximum number of name elements */
+       max_ne = buflen / 2 + 1;
+
+       buf = malloc(buflen);
+       ne_types = malloc(max_ne);
+       ne_values = malloc(max_ne);
+       mval = reallocarray(NULL, max_ne, sizeof(int));
 
        if (!buf || !ne_types || !ne_values || !mval) {
                BIO_printf(bio_err, "malloc error\n");
                goto error;
        }
+
+       sp = subject;
+       bp = buf;
+
        if (*subject != '/') {
                BIO_printf(bio_err, "Subject does not start with '/'.\n");
                goto error;
Index: ca.c
===================================================================
RCS file: /cvs/src/lib/libssl/src/apps/ca.c,v
retrieving revision 1.48
diff -u -p -r1.48 ca.c
--- ca.c        2 May 2014 17:06:46 -0000       1.48
+++ ca.c        4 May 2014 06:07:45 -0000
@@ -1980,17 +1980,17 @@ again2:
                goto err;
 
        /* We now just add it to the database */
-       row[DB_type] = (char *) malloc(2);
+       row[DB_type] = malloc(2);
 
        tm = X509_get_notAfter(ret);
-       row[DB_exp_date] = (char *) malloc(tm->length + 1);
+       row[DB_exp_date] = malloc(tm->length + 1);
        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] = (char *) malloc(8);
+       row[DB_file] = malloc(8);
        row[DB_name] = X509_NAME_oneline(X509_get_subject_name(ret), NULL, 0);
 
        if ((row[DB_type] == NULL) || (row[DB_exp_date] == NULL) ||
@@ -2002,8 +2002,8 @@ again2:
        row[DB_type][0] = 'V';
        row[DB_type][1] = '\0';
 
-       if ((irow = (char **)malloc(sizeof(char *) * (DB_NUMBER + 1))) ==
-           NULL) {
+       irow = reallocarray(NULL, DB_NUMBER + 1, sizeof(char *));
+       if (irow == NULL) {
                BIO_printf(bio_err, "Memory allocation failure\n");
                goto err;
        }
@@ -2244,17 +2244,17 @@ do_revoke(X509 * x509, CA_DB * db, int t
                    row[DB_serial], row[DB_name]);
 
                /* We now just add it to the database */
-               row[DB_type] = (char *) malloc(2);
+               row[DB_type] = malloc(2);
 
                tm = X509_get_notAfter(x509);
-               row[DB_exp_date] = (char *) malloc(tm->length + 1);
+               row[DB_exp_date] = malloc(tm->length + 1);
                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] = (char *) malloc(8);
+               row[DB_file] = malloc(8);
 
                /* row[DB_name] done already */
 
@@ -2267,8 +2267,8 @@ do_revoke(X509 * x509, CA_DB * db, int t
                row[DB_type][0] = 'V';
                row[DB_type][1] = '\0';
 
-               if ((irow = (char **)malloc(sizeof(char *) *
-                   (DB_NUMBER + 1))) == NULL) {
+               irow = reallocarray(NULL, DB_NUMBER + 1, sizeof(char *));
+               if (irow == NULL) {
                        BIO_printf(bio_err, "Memory allocation failure\n");
                        goto err;
                }
@@ -2404,7 +2404,7 @@ do_updatedb(CA_DB * db)
 
        /* get actual time and make a string */
        a_tm = X509_gmtime_adj(a_tm, 0);
-       a_tm_s = (char *) malloc(a_tm->length + 1);
+       a_tm_s = malloc(a_tm->length + 1);
        if (a_tm_s == NULL) {
                cnt = -1;
                goto err;
@@ -2761,7 +2761,7 @@ bin2hex(unsigned char * data, size_t len
        char hex[] = "0123456789ABCDEF";
        int i;
 
-       if ((ret = malloc(len * 2 + 1))) {
+       if ((ret = malloc(len * 2 + 1)) != NULL) {
                for (i = 0; i < len; i++) {
                        ret[i * 2 + 0] = hex[data[i] >> 4];
                        ret[i * 2 + 1] = hex[data[i] & 0x0F];
Index: dgst.c
===================================================================
RCS file: /cvs/src/lib/libssl/src/apps/dgst.c,v
retrieving revision 1.29
diff -u -p -r1.29 dgst.c
--- dgst.c      2 May 2014 17:06:46 -0000       1.29
+++ dgst.c      4 May 2014 06:07:45 -0000
@@ -131,7 +131,7 @@ dgst_main(int argc, char **argv)
 
        signal(SIGPIPE, SIG_IGN);
 
-       if ((buf = (unsigned char *) malloc(BUFSIZE)) == NULL) {
+       if ((buf = malloc(BUFSIZE)) == NULL) {
                BIO_printf(bio_err, "out of memory\n");
                goto end;
        }
Index: dh.c
===================================================================
RCS file: /cvs/src/lib/libssl/src/apps/dh.c,v
retrieving revision 1.18
diff -u -p -r1.18 dh.c
--- dh.c        24 Apr 2014 12:22:22 -0000      1.18
+++ dh.c        4 May 2014 06:07:45 -0000
@@ -251,7 +251,7 @@ bad:
 
                len = BN_num_bytes(dh->p);
                bits = BN_num_bits(dh->p);
-               data = (unsigned char *) malloc(len);
+               data = malloc(len);
                if (data == NULL) {
                        perror("malloc");
                        goto end;
Index: dhparam.c
===================================================================
RCS file: /cvs/src/lib/libssl/src/apps/dhparam.c,v
retrieving revision 1.24
diff -u -p -r1.24 dhparam.c
--- dhparam.c   24 Apr 2014 12:39:02 -0000      1.24
+++ dhparam.c   4 May 2014 06:07:45 -0000
@@ -410,7 +410,7 @@ bad:
 
                len = BN_num_bytes(dh->p);
                bits = BN_num_bits(dh->p);
-               data = (unsigned char *) malloc(len);
+               data = malloc(len);
                if (data == NULL) {
                        perror("malloc");
                        goto end;
Index: dsaparam.c
===================================================================
RCS file: /cvs/src/lib/libssl/src/apps/dsaparam.c,v
retrieving revision 1.22
diff -u -p -r1.22 dsaparam.c
--- dsaparam.c  24 Apr 2014 12:39:02 -0000      1.22
+++ dsaparam.c  4 May 2014 06:07:45 -0000
@@ -307,7 +307,7 @@ bad:
 
                len = BN_num_bytes(dsa->p);
                bits_p = BN_num_bits(dsa->p);
-               data = (unsigned char *) malloc(len + 20);
+               data = malloc(len + 20);
                if (data == NULL) {
                        perror("malloc");
                        goto end;
Index: ecparam.c
===================================================================
RCS file: /cvs/src/lib/libssl/src/apps/ecparam.c,v
retrieving revision 1.10
diff -u -p -r1.10 ecparam.c
--- ecparam.c   24 Apr 2014 12:22:22 -0000      1.10
+++ ecparam.c   4 May 2014 06:07:45 -0000
@@ -312,7 +312,7 @@ bad:
 
                crv_len = EC_get_builtin_curves(NULL, 0);
 
-               curves = malloc((int) (sizeof(EC_builtin_curve) * crv_len));
+               curves = reallocarray(NULL, crv_len, sizeof(EC_builtin_curve));
 
                if (curves == NULL)
                        goto end;
@@ -465,7 +465,7 @@ bad:
                if ((tmp_len = (size_t) BN_num_bytes(ec_cofactor)) > buf_len)
                        buf_len = tmp_len;
 
-               buffer = (unsigned char *) malloc(buf_len);
+               buffer = malloc(buf_len);
 
                if (buffer == NULL) {
                        perror("malloc");
Index: enc.c
===================================================================
RCS file: /cvs/src/lib/libssl/src/apps/enc.c,v
retrieving revision 1.28
diff -u -p -r1.28 enc.c
--- enc.c       3 May 2014 16:03:54 -0000       1.28
+++ enc.c       4 May 2014 06:07:45 -0000
@@ -345,7 +345,7 @@ enc_main(int argc, char **argv)
                        BIO_printf(bio_err, "bufsize=%d\n", bsize);
        }
        strbuf = malloc(SIZE);
-       buff = (unsigned char *) malloc(EVP_ENCODE_LENGTH(bsize));
+       buff = malloc(EVP_ENCODE_LENGTH(bsize));
        if ((buff == NULL) || (strbuf == NULL)) {
                BIO_printf(bio_err, "malloc failure %ld\n", (long) 
EVP_ENCODE_LENGTH(bsize));
                goto end;
Index: rsa.c
===================================================================
RCS file: /cvs/src/lib/libssl/src/apps/rsa.c,v
retrieving revision 1.17
diff -u -p -r1.17 rsa.c
--- rsa.c       24 Apr 2014 12:22:22 -0000      1.17
+++ rsa.c       4 May 2014 06:07:45 -0000
@@ -349,7 +349,7 @@ bad:
 
                i = 1;
                size = i2d_RSA_NET(rsa, NULL, NULL, sgckey);
-               if ((p = (unsigned char *) malloc(size)) == NULL) {
+               if ((p = malloc(size)) == NULL) {
                        BIO_printf(bio_err, "Memory allocation failure\n");
                        goto end;
                }
Index: rsautl.c
===================================================================
RCS file: /cvs/src/lib/libssl/src/apps/rsautl.c,v
retrieving revision 1.16
diff -u -p -r1.16 rsautl.c
--- rsautl.c    23 Apr 2014 19:09:48 -0000      1.16
+++ rsautl.c    4 May 2014 06:07:45 -0000
@@ -256,6 +256,11 @@ rsautl_main(int argc, char **argv)
 
        rsa_in = malloc(keysize * 2);
        rsa_out = malloc(keysize);
+       if (rsa_in == NULL || rsa_out == NULL) {
+               BIO_printf(bio_err, "Memory allocation failure\n");
+               ERR_print_errors(bio_err);
+               goto end;
+       }
 
        /* Read the input data */
        rsa_inlen = BIO_read(in, rsa_in, keysize * 2);
Index: s_client.c
===================================================================
RCS file: /cvs/src/lib/libssl/src/apps/s_client.c,v
retrieving revision 1.48
diff -u -p -r1.48 s_client.c
--- s_client.c  2 May 2014 17:06:46 -0000       1.48
+++ s_client.c  4 May 2014 06:07:46 -0000
@@ -472,10 +472,13 @@ ssl_srp_verify_param_cb(SSL * s, void *a
 static char *
 ssl_give_srp_client_pwd_cb(SSL * s, void *arg)
 {
-       SRP_ARG *srp_arg = (SRP_ARG *) arg;
-       char *pass = (char *) malloc(PWD_STRLEN + 1);
+       SRP_ARG *srp_arg;
+       char *pass;
        PW_CB_DATA cb_tmp;
        int l;
+
+       srp_arg = arg;
+       pass = malloc(PWD_STRLEN + 1);
 
        cb_tmp.password = (char *) srp_arg->srppassin;
        cb_tmp.prompt_info = "SRP user";
Index: speed.c
===================================================================
RCS file: /cvs/src/lib/libssl/src/apps/speed.c,v
retrieving revision 1.38
diff -u -p -r1.38 speed.c
--- speed.c     2 May 2014 17:06:46 -0000       1.38
+++ speed.c     4 May 2014 06:07:46 -0000
@@ -563,11 +563,11 @@ speed_main(int argc, char **argv)
                rsa_key[i] = NULL;
 #endif
 
-       if ((buf = (unsigned char *) malloc((int) BUFSIZE)) == NULL) {
+       if ((buf = malloc(BUFSIZE)) == NULL) {
                BIO_printf(bio_err, "out of memory\n");
                goto end;
        }
-       if ((buf2 = (unsigned char *) malloc((int) BUFSIZE)) == NULL) {
+       if ((buf2 = malloc(BUFSIZE)) == NULL) {
                BIO_printf(bio_err, "out of memory\n");
                goto end;
        }
@@ -2178,7 +2178,8 @@ do_multi(int multi)
        int *fds;
        static char sep[] = ":";
 
-       fds = malloc(multi * sizeof *fds);
+       fds = reallocarray(NULL, multi, sizeof(int));
+       /* If the reallocarray failed, it looks acceptable to just die here. */
        for (n = 0; n < multi; ++n) {
                if (pipe(fd) == -1) {
                        fprintf(stderr, "pipe failure\n");
Index: srp.c
===================================================================
RCS file: /cvs/src/lib/libssl/src/apps/srp.c,v
retrieving revision 1.10
diff -u -p -r1.10 srp.c
--- srp.c       24 Apr 2014 12:22:22 -0000      1.10
+++ srp.c       4 May 2014 06:07:46 -0000
@@ -176,7 +176,8 @@ update_index(CA_DB * db, BIO * bio, char
        char **irow;
        int i;
 
-       if ((irow = (char **) malloc(sizeof(char *) * (DB_NUMBER + 1))) == 
NULL) {
+       irow = reallocarray(NULL, DB_NUMBER + 1, sizeof(char *));
+       if (irow == NULL)
                BIO_printf(bio_err, "Memory allocation failure\n");
                return 0;
        }

Reply via email to