Browse Source

use xstrfmt to replace xmalloc + strcpy/strcat

It's easy to get manual allocation calculations wrong, and
the use of strcpy/strcat raise red flags for people looking
for buffer overflows (though in this case each site was
fine).

It's also shorter to use xstrfmt, and the printf-format
tends to be easier for a reader to see what the final string
will look like.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Jeff King 11 years ago committed by Junio C Hamano
parent
commit
b2724c8787
  1. 4
      builtin/apply.c
  2. 9
      builtin/fetch.c
  3. 5
      builtin/name-rev.c
  4. 5
      sha1_name.c
  5. 6
      shell.c

4
builtin/apply.c

@ -1281,9 +1281,7 @@ static int parse_git_header(const char *line, int len, unsigned int size, struct @@ -1281,9 +1281,7 @@ static int parse_git_header(const char *line, int len, unsigned int size, struct
*/
patch->def_name = git_header_name(line, len);
if (patch->def_name && root) {
char *s = xmalloc(root_len + strlen(patch->def_name) + 1);
strcpy(s, root);
strcpy(s + root_len, patch->def_name);
char *s = xstrfmt("%s%s", root, patch->def_name);
free(patch->def_name);
patch->def_name = s;
}

9
builtin/fetch.c

@ -1053,16 +1053,11 @@ static int fetch_one(struct remote *remote, int argc, const char **argv) @@ -1053,16 +1053,11 @@ static int fetch_one(struct remote *remote, int argc, const char **argv)
refs = xcalloc(argc + 1, sizeof(const char *));
for (i = 0; i < argc; i++) {
if (!strcmp(argv[i], "tag")) {
char *ref;
i++;
if (i >= argc)
die(_("You need to specify a tag name."));
ref = xmalloc(strlen(argv[i]) * 2 + 22);
strcpy(ref, "refs/tags/");
strcat(ref, argv[i]);
strcat(ref, ":refs/tags/");
strcat(ref, argv[i]);
refs[j++] = ref;
refs[j++] = xstrfmt("refs/tags/%s:refs/tags/%s",
argv[i], argv[i]);
} else
refs[j++] = argv[i];
}

5
builtin/name-rev.c

@ -33,10 +33,7 @@ static void name_rev(struct commit *commit, @@ -33,10 +33,7 @@ static void name_rev(struct commit *commit,
return;

if (deref) {
char *new_name = xmalloc(strlen(tip_name)+3);
strcpy(new_name, tip_name);
strcat(new_name, "^0");
tip_name = new_name;
tip_name = xstrfmt("%s^0", tip_name);

if (generation)
die("generation: %d, but deref?", generation);

5
sha1_name.c

@ -1252,10 +1252,7 @@ static void diagnose_invalid_sha1_path(const char *prefix, @@ -1252,10 +1252,7 @@ static void diagnose_invalid_sha1_path(const char *prefix,
die("Path '%s' exists on disk, but not in '%.*s'.",
filename, object_name_len, object_name);
if (errno == ENOENT || errno == ENOTDIR) {
char *fullname = xmalloc(strlen(filename)
+ strlen(prefix) + 1);
strcpy(fullname, prefix);
strcat(fullname, filename);
char *fullname = xstrfmt("%s%s", prefix, filename);

if (!get_tree_entry(tree_sha1, fullname,
sha1, &mode)) {

6
shell.c

@ -46,11 +46,7 @@ static int is_valid_cmd_name(const char *cmd) @@ -46,11 +46,7 @@ static int is_valid_cmd_name(const char *cmd)

static char *make_cmd(const char *prog)
{
char *prefix = xmalloc((strlen(prog) + strlen(COMMAND_DIR) + 2));
strcpy(prefix, COMMAND_DIR);
strcat(prefix, "/");
strcat(prefix, prog);
return prefix;
return xstrfmt("%s/%s", COMMAND_DIR, prog);
}

static void cd_to_homedir(void)

Loading…
Cancel
Save