Use asprintf instead of malloc/strcpy/strcat in many places
authorGreg Hudson <ghudson@mit.edu>
Mon, 20 Oct 2008 21:14:47 +0000 (21:14 +0000)
committerGreg Hudson <ghudson@mit.edu>
Mon, 20 Oct 2008 21:14:47 +0000 (21:14 +0000)
ticket: 6200
status: open

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@20901 dc483132-0cff-0310-8789-dd5450dbe970

18 files changed:
src/appl/bsd/kcmd.c
src/appl/bsd/krlogind.c
src/appl/gssftp/ftp/glob.c
src/clients/kpasswd/ksetpwd.c
src/kadmin/cli/kadmin.c
src/kadmin/dbutil/dump.c
src/kadmin/dbutil/kdb5_util.c
src/kadmin/dbutil/loadv4.c
src/lib/kdb/kdb5.c
src/lib/krb5/rcache/rc_io.c
src/plugins/kdb/db2/kdb_db2.c
src/slave/kprop.c
src/slave/kpropd.c
src/tests/shlib/t_loader.c
src/util/et/error_table.y
src/util/et/internal.h
src/util/profile/prof_file.c
src/util/ss/utils.c

index 604bcaf207ba0e826cd799bfaab58856c385ef63..7d22d59056a3f0e13cb5a0454eeff1660b514cb3 100644 (file)
@@ -424,13 +424,10 @@ kcmd(sock, ahost, rport, locuser, remuser, cmd, fd2p, service, realm,
     enum kcmd_proto protonum = *protonump;
     int addrfamily = /* AF_INET */0;
 
-    if ((cksumbuf = malloc(strlen(cmd)+strlen(remuser)+64)) == 0 ) {
+    if (asprintf(&cksumbuf, "%u:%s%s", ntohs(rport), cmd, remuser) < 0) {
        fprintf(stderr, "Unable to allocate memory for checksum buffer.\n");
        return(-1);
     }
-    sprintf(cksumbuf, "%u:", ntohs(rport));
-    strcat(cksumbuf, cmd);
-    strcat(cksumbuf, remuser);
     cksumdat.data = cksumbuf;
     cksumdat.length = strlen(cksumbuf);
        
index cd362a4aa7e8c96ffdcf016e9b23a6d7a8ec81d9..2fe4c041037f2eeac1cec7fbec833cd5cbaab868 100644 (file)
@@ -1478,16 +1478,12 @@ recvauth(valid_checksum)
       if (authenticator->checksum) {
        struct sockaddr_in adr;
        socklen_t adr_length = sizeof(adr);
-       char * chksumbuf = (char *) malloc(strlen(term)+strlen(lusername)+32);
+       char * chksumbuf;
        if (getsockname(netf, (struct sockaddr *) &adr, &adr_length) != 0)
            goto error_cleanup;
-       if (chksumbuf == 0)
+       if (asprintf(&chksumbuf, "%u:%s%s", ntohs(adr.sin_port), term, lusername) < 0)
            goto error_cleanup;
 
-       sprintf(chksumbuf,"%u:", ntohs(adr.sin_port));
-       strcat(chksumbuf,term);
-       strcat(chksumbuf,lusername);
-
        status = krb5_verify_checksum(bsd_context,
                                      authenticator->checksum->checksum_type,
                                      authenticator->checksum,
index 272e503056339c6e51216ae9d60dd9bb5e1ffd06..6134798ef41f93c7d858a7a9667367e9796b9f9d 100644 (file)
@@ -57,6 +57,8 @@ static char sccsid[] = "@(#)glob.c    5.9 (Berkeley) 2/25/91";
 #include <limits.h>
 #endif
 
+#include <k5-platform.h>
+
 #include "ftp_var.h"
 
 #ifdef ARG_MAX
@@ -258,10 +260,7 @@ matchdir(pattern)
        char *base = *gpath ? gpath : ".";
        char *buffer = 0;
 
-       buffer = malloc(strlen(base) + strlen("\\*") + 1);
-       if (!buffer) return;
-       strcpy(buffer, base);
-       strcat(buffer, "\\*");
+       if (asprintf(&buffer, "%s\\*", base) < 0) return;
        hFile = FindFirstFile(buffer, &file_data);
        if (hFile == INVALID_HANDLE_VALUE) {
                if (!globbed)
@@ -732,12 +731,10 @@ char *
 strspl(cp, dp)
        register char *cp, *dp;
 {
-       register char *ep = malloc((unsigned)(strlen(cp) + strlen(dp) + 1));
+       char *ep;
 
-       if (ep == (char *)0)
+       if (asprintf(&ep, "%s%s", cp, dp) < 0)
                fatal("Out of memory");
-       (void) strcpy(ep, cp);
-       (void) strcat(ep, dp);
        return (ep);
 }
 
index 41500dd03729e38f2497de435eb7b009e1b873d4..45f782f08f9e1c1ffb357ae5af8e43dc7962d630 100644 (file)
@@ -3,6 +3,7 @@
 #include <unistd.h>
 #include <stdio.h>
 #include <time.h>
+#include <k5-platform.h>
 
 #define TKTTIMELEFT     60*10   /* ten minutes */
 
@@ -69,14 +70,11 @@ static kbrccache_t userinitcontext(
        krb5_unparse_name( kcontext, kme, &pName );
        if( cachename )
        {
-               pCacheName = malloc( strlen( pName ) + strlen( cachename ) + 1 );
-               if( pCacheName == NULL )
+               if (asprintf(&pCacheName, "%s%s", cachename, pName) < 0)
                {
                        kres = KRB5_CC_NOMEM;
                        goto fail;
                }
-               strcpy( pCacheName, cachename );
-               strcat( pCacheName, pName );
                kres = krb5_cc_resolve( kcontext, pCacheName, &kcache );
                if( kres )
                {
index b3f2b3f21f1f8bfadc905dc544bdc3e4c5fea4b7..e5a336aa054d0703bb014b35c54ed5594e382c4d 100644 (file)
@@ -279,14 +279,9 @@ char *kadmin_startup(argc, argv)
            break;
        case 'd':
            /* now db_name is not a seperate argument. It has to be passed as part of the db_args */
-           if (!db_name) {
-               db_name = malloc(strlen(optarg) + sizeof("dbname="));
-           } else {
-               db_name = realloc(db_name, strlen(optarg) + sizeof("dbname="));
-           }
-
-           strcpy(db_name, "dbname=");
-           strcat(db_name, optarg);
+           if (db_name)
+               free(db_name);
+           asprintf(&db_name, "dbname=%s", optarg);
 
            db_args_size++;
            {
@@ -437,43 +432,27 @@ char *kadmin_startup(argc, argv)
            }
            if (cp != NULL)
                *cp = '\0';
-           princstr = (char*)malloc(strlen(canon) + 6 /* "/admin" */ +
-                                    (realm ? 1 + strlen(realm) : 0) + 1);
-           if (princstr == NULL) {
+           if (asprintf(&princstr, "%s/admin%s%s", canon,
+                        (realm) ? "@" : "",
+                        (realm) ? realm : "") < 0) {
                fprintf(stderr, "%s: out of memory\n", whoami);
                exit(1);
            }
-           strcpy(princstr, canon);
-           strcat(princstr, "/admin");
-           if (realm) {
-               strcat(princstr, "@");
-               strcat(princstr, realm);
-           }
            free(canon);
            krb5_free_principal(context, princ);
            freeprinc++;
        } else if ((luser = getenv("USER"))) {
-           princstr = (char *) malloc(strlen(luser) + 7 /* "/admin@" */
-                                      + strlen(def_realm) + 1);
-           if (princstr == NULL) {
+           if (asprintf(&princstr, "%s/admin@%s", luser, def_realm) < 0) {
                fprintf(stderr, "%s: out of memory\n", whoami);
                exit(1);
            }
-           strcpy(princstr, luser);
-           strcat(princstr, "/admin");
-           strcat(princstr, "@");
-           strcat(princstr, def_realm);
            freeprinc++;
        } else if ((pw = getpwuid(getuid()))) {
-           princstr = (char *) malloc(strlen(pw->pw_name) + 7 /* "/admin@" */
-                                      + strlen(def_realm) + 1);
-           if (princstr == NULL) {
+           if (asprintf(&princstr, "%s/admin@%s", pw->pw_name,
+                        def_realm) < 0) {
                fprintf(stderr, "%s: out of memory\n", whoami);
                exit(1);
            }
-           strcpy(princstr, pw->pw_name);
-           strcat(princstr, "/admin@");
-           strcat(princstr, def_realm);
            freeprinc++;
        } else {
            fprintf(stderr, "%s: unable to figure out a principal name\n",
index fbb8fd21e23f92a8be26643bd37162de6ca65c8e..7c7bf3203f4cdeee0d6f3caf0dbd2e2af9ead79f 100644 (file)
@@ -330,15 +330,12 @@ void update_ok_file (file_name)
        int fd;
        static char ok[]=".dump_ok";
 
-       if ((file_ok = (char *)malloc(strlen(file_name) + strlen(ok) + 1))
-           == NULL) {
+       if (asprintf(&file_ok, "%s%s", file_name, ok) < 0) {
                com_err(progname, ENOMEM,
                        "while allocating filename for update_ok_file");
                exit_status++;
                return;
        }
-       strcpy(file_ok, file_name);
-       strcat(file_ok, ok);
        if ((fd = open(file_ok, O_WRONLY|O_CREAT|O_TRUNC, 0600)) < 0) {
                com_err(progname, errno, "while creating 'ok' file, '%s'",
                        file_ok);
@@ -2282,14 +2279,11 @@ load_db(argc, argv)
     }
     dumpfile = argv[aindex];
 
-    if (!(dbname_tmp = (char *) malloc(strlen(dbname)+
-                                      strlen(dump_tmptrail)+1))) {
+    if (asprintf(&dbname_tmp, "%s%s", dbname, dump_tmptrail) < 0) {
        fprintf(stderr, no_name_mem_fmt, progname);
        exit_status++;
        return;
     }
-    strcpy(dbname_tmp, dbname);
-    strcat(dbname_tmp, dump_tmptrail);
 
     /*
      * Initialize the Kerberos context and error tables.
index ff6bcc99573de601048447e1170ed670df4b8ee9..a61469a17552b5fc09baaa32e3681264dabf9da9 100644 (file)
@@ -215,16 +215,12 @@ int main(argc, argv)
            global_params.dbname = koptarg;
            global_params.mask |= KADM5_CONFIG_DBNAME;
 
-           db_name_tmp = malloc( strlen(global_params.dbname) + sizeof("dbname="));
-           if( db_name_tmp == NULL )
+           if (asprintf(&db_name_tmp, "dbname=%s", global_params.dbname) < 0)
            {
                com_err(progname, ENOMEM, "while parsing command arguments");
                exit(1);
            }
 
-           strcpy( db_name_tmp, "dbname=");
-           strcat( db_name_tmp, global_params.dbname );
-
            if (!add_db_arg(db_name_tmp)) {
                com_err(progname, ENOMEM, "while parsing command arguments\n");
                exit(1);
index 4c3591ea0fa3f64597bd4f9124fd4df43d82a328..91b31fe0c7bd87fd4a000f9744b4d36e3604d2f1 100644 (file)
@@ -267,16 +267,11 @@ load_v4db(argc, argv)
        }
        tempdbname = dbname;
     } else {
-       size_t dbnamelen = strlen(dbname);
-       tempdbname = malloc(dbnamelen + 2);
-       if (tempdbname == 0) {
+       if (asprintf(&tempdbname, "%s~", dbname) < 0)
            com_err(PROGNAME, ENOMEM, "allocating temporary filename");
            krb5_free_context(context);
            return;
        }
-       strcpy(tempdbname, dbname);
-       tempdbname[dbnamelen] = '~';
-       tempdbname[dbnamelen+1] = 0;
        (void) krb5_db_destroy(context, tempdbname);
     }
        
index 67ceacb9944412d7c7ba2cff4679596c8ddd6d24..eb68f22fd94631ad86bb06cb8dd1068167394b3e 100644 (file)
@@ -1678,23 +1678,14 @@ krb5_db_setup_mkey_name(krb5_context context,
                        char **fullname, krb5_principal * principal)
 {
     krb5_error_code retval;
-    size_t  keylen;
-    size_t  rlen = strlen(realm);
     char   *fname;
 
     if (!keyname)
        keyname = KRB5_KDB_M_NAME;      /* XXX external? */
 
-    keylen = strlen(keyname);
-
-    fname = malloc(keylen + rlen + strlen(REALM_SEP_STRING) + 1);
-    if (!fname)
+    if (asprintf(&fname, "%s%s%s", keyname, REALM_SEP_STRING, realm) < 0)
        return ENOMEM;
 
-    strcpy(fname, keyname);
-    strcat(fname, REALM_SEP_STRING);
-    strcat(fname, realm);
-
     if ((retval = krb5_parse_name(context, fname, principal)))
        return retval;
     if (fullname)
index 0309ade5f271a32bebfa3638fe2c921344de1085..1043c30ed0ba40e3e34424ee07892f50807169cd 100644 (file)
@@ -169,11 +169,8 @@ krb5_rc_io_creat(krb5_context context, krb5_rc_iostuff *d, char **fn)
 
     GETDIR;
     if (fn && *fn) {
-       if (!(d->fn = malloc(strlen(*fn) + dirlen + 1)))
+       if (asprintf(&d->fn, "%s%s%s", dir, PATH_SEPARATOR, *fn) < 0)
            return KRB5_RC_IO_MALLOC;
-       (void) strcpy(d->fn, dir);
-       (void) strcat(d->fn, PATH_SEPARATOR);
-       (void) strcat(d->fn, *fn);
        unlink(d->fn);
        d->fd = THREEPARAMOPEN(d->fn, O_WRONLY | O_CREAT | O_TRUNC | O_EXCL |
                               O_BINARY, 0600);
@@ -236,11 +233,8 @@ krb5_rc_io_open_internal(krb5_context context, krb5_rc_iostuff *d, char *fn,
        if (!(d->fn = strdup(full_pathname)))
            return KRB5_RC_IO_MALLOC;
     } else {
-       if (!(d->fn = malloc(strlen(fn) + dirlen + 1)))
+       if (asprintf(&d->fn, "%s%s%s", dir, PATH_SEPARATOR, fn) < 0)
            return KRB5_RC_IO_MALLOC;
-       (void) strcpy(d->fn, dir);
-       (void) strcat(d->fn, PATH_SEPARATOR);
-       (void) strcat(d->fn, fn);
     }
 
 #ifdef NO_USERID
index 0aa3c4fd8ca81434371739da90553d958b16320f..1e67ea03478205eb101be358abc8aec222bb7dd5 100644 (file)
@@ -219,11 +219,8 @@ gen_dbsuffix(char *db_name, char *sfx)
     if (sfx == NULL)
        return ((char *) NULL);
 
-    dbsuffix = malloc(strlen(db_name) + strlen(sfx) + 1);
-    if (!dbsuffix)
+    if (asprintf(&dbsuffix, "%s%s", db_name, sfx) < 0)
        return (0);
-    (void) strcpy(dbsuffix, db_name);
-    (void) strcat(dbsuffix, sfx);
     return dbsuffix;
 }
 
index f47b2b74d027fff3f4c259a9e1cd89d1b8bb4102..a2542363e39d4912743e4e70872dfa61c552f95a 100644 (file)
@@ -492,13 +492,10 @@ open_database(context, data_fn, size)
                        data_fn);
                exit(1);
        }
-       if ((data_ok_fn = (char *) malloc(strlen(data_fn)+strlen(ok)+1))
-           == NULL) {
+       if (asprintf(&data_ok_fn, "%s%s", data_fn, ok) < 0) {
                com_err(progname, ENOMEM, "while trying to malloc data_ok_fn");
                exit(1);
        }
-       strcpy(data_ok_fn, data_fn);
-       strcat(data_ok_fn, ok);
        if (stat(data_ok_fn, &stbuf_ok)) {
                com_err(progname, errno, "while trying to stat %s",
                        data_ok_fn);
@@ -730,17 +727,12 @@ void update_last_prop_file(hostname, file_name)
        int fd;
        static char last_prop[]=".last_prop";
 
-       if ((file_last_prop = (char *)malloc(strlen(file_name) +
-                                            strlen(hostname) + 1 +
-                                            strlen(last_prop) + 1)) == NULL) {
+       if (asprintf(&file_last_prop, "%s.%s%s", file_name, hostname,
+                    last_prop) < 0) {
                com_err(progname, ENOMEM,
                        "while allocating filename for update_last_prop_file");
                return;
        }
-       strcpy(file_last_prop, file_name);
-       strcat(file_last_prop, ".");
-       strcat(file_last_prop, hostname);
-       strcat(file_last_prop, last_prop);
        if ((fd = THREEPARAMOPEN(file_last_prop, O_WRONLY|O_CREAT|O_TRUNC, 0600)) < 0) {
                com_err(progname, errno,
                        "while creating 'last_prop' file, '%s'",
index 959dd4ab5caaf182a1f147c423e50baacd117ed5..123b2fe6614822ac14071ff4cdf421611e812198 100644 (file)
@@ -1082,14 +1082,11 @@ void PRS(argv)
        /*
         * Construct the name of the temporary file.
         */
-       if ((temp_file_name = (char *) malloc(strlen(file) +
-                                              strlen(tmp) + 1)) == NULL) {
+       if (asprintf(&temp_file_name, "%s%s", file, tmp) < 0) {
                com_err(progname, ENOMEM,
                        "while allocating filename for temp file");
                exit(1);
        }
-       strcpy(temp_file_name, file);
-       strcat(temp_file_name, tmp);
 
        retval = kadm5_get_config_params(kpropd_context, 1, &params, &params);
        if (retval) {
index 70cd6d13b8003825db86a2ada6289328223d85ac..cdc255055d26d101ee4511c1e5146a200cc9eb59 100644 (file)
@@ -5,6 +5,7 @@
 #include "autoconf.h"
 #include "krb5.h"
 #include "gssapi/gssapi.h"
+#include "k5-platform.h"
 #define HAVE_DLOPEN 1
 
 static int verbose = 1;
@@ -53,28 +54,20 @@ static void *do_open_1(const char *libname, const char *rev,
 {
     void *p;
     char *namebuf;
-    size_t sz;
+    int r;
 
     if (verbose)
        printf("from line %d: do_open(%s)...%*s", line, libname,
               HORIZ-strlen(libname), "");
-    sz = strlen(SHLIB_SUFFIX) + strlen(libname) + 4;
 #ifdef _AIX
-    sz += strlen(rev) + 8;
+    r = asprintf(&namebuf, "lib%s%s", libname, SHLIB_SUFFIX);
+#else
+    r = asprintf(&namebuf, "lib%s%s(shr.o.%s)", libname, SHLIB_SUFFIX, rev);
 #endif
-    namebuf = malloc(sz);
-    if (namebuf == 0) {
-       perror("malloc");
+    if (r < 0) {
+       perror("asprintf");
        exit(1);
     }
-    strcpy(namebuf, "lib");
-    strcat(namebuf, libname);
-    strcat(namebuf, SHLIB_SUFFIX);
-#ifdef _AIX
-    strcat(namebuf, "(shr.o.");
-    strcat(namebuf, rev);
-    strcat(namebuf, ")");
-#endif
 
 #ifndef RTLD_MEMBER
 #define RTLD_MEMBER 0
index 6162d61b526d812dbdfb44fcaea149a0b72a993f..750e9d9734a290a44f33b03059d3009bc8e7801c 100644 (file)
@@ -108,10 +108,7 @@ quote(string)
        char const *string;
 {
        char *rv;
-       rv = malloc(strlen(string)+3);
-       strcpy(rv, "\"");
-       strcat(rv, string);
-       strcat(rv, "\"");
+       asprintf(&rv, "\"%s\"", string);
        return(rv);
 }
 
index 57b5cd58e569c2e5b4de931d00f35606e986882d..f3e3abef390932e1ad73cc4ee078e5be42d0a40c 100644 (file)
@@ -5,6 +5,8 @@
 
 #include <errno.h>
 
+#include "k5-platform.h"
+
 #ifndef SYS_ERRLIST_DECLARED
 extern char const * const sys_errlist[];
 extern const int sys_nerr;
index 13d8860e8b80d2843da31207cd68940b09786bd7..4851788e66f043cd5f3a13833edd26d5b5fb5826 100644 (file)
@@ -198,7 +198,6 @@ errcode_t profile_open_file(const_profile_filespec_t filespec,
        prf_file_t      prf;
        errcode_t       retval;
        char            *home_env = 0;
-       unsigned int    len;
        prf_data_t      data;
        char            *expanded_filename;
 
@@ -214,7 +213,6 @@ errcode_t profile_open_file(const_profile_filespec_t filespec,
        memset(prf, 0, sizeof(struct _prf_file_t));
        prf->magic = PROF_MAGIC_FILE;
 
-       len = strlen(filespec)+1;
        if (filespec[0] == '~' && filespec[1] == '/') {
                home_env = getenv("HOME");
 #ifdef HAVE_PWD_H
@@ -229,19 +227,17 @@ errcode_t profile_open_file(const_profile_filespec_t filespec,
                        home_env = pw->pw_dir;
                }
 #endif
-               if (home_env)
-                       len += strlen(home_env);
        }
-       expanded_filename = malloc(len);
+       if (home_env) {
+           if (asprintf(&expanded_filename, "%s%s", home_env,
+                        filespec + 1) < 0)
+               expanded_filename = 0;
+       } else
+           expanded_filename = strdup(filespec);
        if (expanded_filename == 0) {
            free(prf);
            return ENOMEM;
        }
-       if (home_env) {
-           strcpy(expanded_filename, home_env);
-           strcat(expanded_filename, filespec+1);
-       } else
-           memcpy(expanded_filename, filespec, len);
 
        retval = k5_mutex_lock(&g_shared_trees_mutex);
        if (retval) {
index c578001574833cd8207fc5aa4566cd3c6d322ef6..7f4e9214acaf3a3d55dbcf902ff423d703cf4361 100644 (file)
@@ -56,26 +56,11 @@ char * generate_rqte(func_name, info_string, cmds, options)
     char const *cmds;
     int options;
 {
-    int size;
-    char *string, *var_name, numbuf[16];
+    char *string, *var_name;
     var_name = generate_cmds_string(cmds);
     generate_function_definition(func_name);
-    size = 6;          /* "    { " */
-    size += strlen(var_name)+8; /* "quux, " */
-    size += strlen(func_name)+8; /* "foo, " */
-    size += strlen(info_string)+8; /* "\"Info!\", " */
-    sprintf(numbuf, "%d", options);
-    size += strlen(numbuf)+5;          /* " }," + NL + NUL */
-    string = malloc(size);
-    strcpy(string, "    { ");
-    strcat(string, var_name);
-    strcat(string, ",\n      ");
-    strcat(string, func_name);
-    strcat(string, ",\n      ");
-    strcat(string, info_string);
-    strcat(string, ",\n      ");
-    strcat(string, numbuf);
-    strcat(string, " },\n");
+    asprintf(&string, "    { %s,\n      %s,\n      %s,\n      %d },\n",
+            var_name, func_name, info_string, options);
     return(string);
 }
 
@@ -96,14 +81,8 @@ char *str_concat3(a, b, c)
        register char *a, *b, *c;
 {
        char *result;
-       int size_a = strlen(a);
-       int size_b = strlen(b);
-       int size_c = strlen(c);
 
-       result = malloc((size_a + size_b + size_c + 2)*sizeof(char));
-       strcpy(result, a);
-       strcpy(&result[size_a], c);
-       strcpy(&result[size_a+size_c], b);
+       asprintf(&result, "%s%s%s", a, c, b);
        return(result);
 }
 
@@ -112,13 +91,8 @@ char *quote(string)
        register char *string;
 {
        register char *result;
-       int len;
-       len = strlen(string)+1;
-       result = malloc(len+2);
-       result[0] = '"';
-       strncpy(&result[1], string, len-1);
-       result[len] = '"';
-       result[len+1] = '\0';
+
+       asprintf(&result, "\"%s\"", string);
        return(result);
 }