On Sun, May 04, 2014 at 02:38:40AM -0400, Jean-Philippe Ouellet wrote:
> 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);
                               ^^^^
Fail!

>  
> -     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));

why not use calloc(2)?

>  
>       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 *));

why not use calloc(2)?

> +     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 *));

why not use calloc(2)?

> +             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));

calloc(2)?

>  
>               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. */

huh?

>       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 *));

calloc(2)?

> +     if (irow == NULL)
>               BIO_printf(bio_err, "Memory allocation failure\n");
>               return 0;
>       }
> 

Reply via email to