Skip to content

Commit

Permalink
ref-filter: drop sprintf and strcpy calls
Browse files Browse the repository at this point in the history
The ref-filter code comes from for-each-ref, and inherited a
number of raw sprintf and strcpy calls. These are generally
all safe, as we custom-size the buffers, or are formatting
numbers into sufficiently large buffers. But we can make the
resulting code even simpler and more obviously correct by
using some of our helper functions.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Sep 25, 2015
1 parent 9ae9701 commit a5e03bf
Showing 1 changed file with 22 additions and 48 deletions.
70 changes: 22 additions & 48 deletions ref-filter.c
Original file line number Diff line number Diff line change
Expand Up @@ -192,9 +192,7 @@ static int grab_objectname(const char *name, const unsigned char *sha1,
struct atom_value *v)
{
if (!strcmp(name, "objectname")) {
char *s = xmalloc(41);
strcpy(s, sha1_to_hex(sha1));
v->s = s;
v->s = xstrdup(sha1_to_hex(sha1));
return 1;
}
if (!strcmp(name, "objectname:short")) {
Expand All @@ -219,10 +217,8 @@ static void grab_common_values(struct atom_value *val, int deref, struct object
if (!strcmp(name, "objecttype"))
v->s = typename(obj->type);
else if (!strcmp(name, "objectsize")) {
char *s = xmalloc(40);
sprintf(s, "%lu", sz);
v->ul = sz;
v->s = s;
v->s = xstrfmt("%lu", sz);
}
else if (deref)
grab_objectname(name, obj->sha1, v);
Expand All @@ -246,11 +242,8 @@ static void grab_tag_values(struct atom_value *val, int deref, struct object *ob
v->s = tag->tag;
else if (!strcmp(name, "type") && tag->tagged)
v->s = typename(tag->tagged->type);
else if (!strcmp(name, "object") && tag->tagged) {
char *s = xmalloc(41);
strcpy(s, sha1_to_hex(tag->tagged->sha1));
v->s = s;
}
else if (!strcmp(name, "object") && tag->tagged)
v->s = xstrdup(sha1_to_hex(tag->tagged->sha1));
}
}

Expand All @@ -268,32 +261,22 @@ static void grab_commit_values(struct atom_value *val, int deref, struct object
if (deref)
name++;
if (!strcmp(name, "tree")) {
char *s = xmalloc(41);
strcpy(s, sha1_to_hex(commit->tree->object.sha1));
v->s = s;
v->s = xstrdup(sha1_to_hex(commit->tree->object.sha1));
}
if (!strcmp(name, "numparent")) {
char *s = xmalloc(40);
else if (!strcmp(name, "numparent")) {
v->ul = commit_list_count(commit->parents);
sprintf(s, "%lu", v->ul);
v->s = s;
v->s = xstrfmt("%lu", v->ul);
}
else if (!strcmp(name, "parent")) {
int num = commit_list_count(commit->parents);
int i;
struct commit_list *parents;
char *s = xmalloc(41 * num + 1);
v->s = s;
for (i = 0, parents = commit->parents;
parents;
parents = parents->next, i = i + 41) {
struct strbuf s = STRBUF_INIT;
for (parents = commit->parents; parents; parents = parents->next) {
struct commit *parent = parents->item;
strcpy(s+i, sha1_to_hex(parent->object.sha1));
if (parents->next)
s[i+40] = ' ';
if (parents != commit->parents)
strbuf_addch(&s, ' ');
strbuf_addstr(&s, sha1_to_hex(parent->object.sha1));
}
if (!i)
*s = '\0';
v->s = strbuf_detach(&s, NULL);
}
}
}
Expand Down Expand Up @@ -700,25 +683,20 @@ static void populate_value(struct ref_array_item *ref)
else if (!strcmp(formatp, "track") &&
(starts_with(name, "upstream") ||
starts_with(name, "push"))) {
char buf[40];

if (stat_tracking_info(branch, &num_ours,
&num_theirs, NULL))
continue;

if (!num_ours && !num_theirs)
v->s = "";
else if (!num_ours) {
sprintf(buf, "[behind %d]", num_theirs);
v->s = xstrdup(buf);
} else if (!num_theirs) {
sprintf(buf, "[ahead %d]", num_ours);
v->s = xstrdup(buf);
} else {
sprintf(buf, "[ahead %d, behind %d]",
num_ours, num_theirs);
v->s = xstrdup(buf);
}
else if (!num_ours)
v->s = xstrfmt("[behind %d]", num_theirs);
else if (!num_theirs)
v->s = xstrfmt("[ahead %d]", num_ours);
else
v->s = xstrfmt("[ahead %d, behind %d]",
num_ours, num_theirs);
continue;
} else if (!strcmp(formatp, "trackshort") &&
(starts_with(name, "upstream") ||
Expand All @@ -745,12 +723,8 @@ static void populate_value(struct ref_array_item *ref)

if (!deref)
v->s = refname;
else {
int len = strlen(refname);
char *s = xmalloc(len + 4);
sprintf(s, "%s^{}", refname);
v->s = s;
}
else
v->s = xstrfmt("%s^{}", refname);
}

for (i = 0; i < used_atom_cnt; i++) {
Expand Down

0 comments on commit a5e03bf

Please sign in to comment.