diff options
author | Jeff King <peff@peff.net> | 2013-04-05 17:15:50 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2013-04-06 18:57:15 -0700 |
commit | aaa07e3eee6f42d0adeac826dfb52d5ade26defc (patch) | |
tree | 0a188f1f8321dce9fe433eba70b8598669a4f77d /builtin/show-branch.c | |
parent | 15999998fbda60552742275570947431b57108ae (diff) | |
download | git-aaa07e3eee6f42d0adeac826dfb52d5ade26defc.tar.gz git-aaa07e3eee6f42d0adeac826dfb52d5ade26defc.tar.xz |
show-branch: use strbuf instead of static buffer
When we generate relative names (e.g., "master~20^2"), we
format the name into a static buffer, then xstrdup the
result to attach it to the commit. Since the first thing we
add into the static buffer is the already-computed name of
the child commit, the names may get longer and longer as
the traversal gets deeper, and we may eventually overflow
the fixed-size buffer.
Fix this by converting the fixed-size buffer into a dynamic
strbuf. The performance implications should be minimal, as
we end up allocating a heap copy of the name anyway (and now
we can just detach the heap copy from the strbuf).
Reported-by: Eric Roman <eroman@chromium.org>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/show-branch.c')
-rw-r--r-- | builtin/show-branch.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/builtin/show-branch.c b/builtin/show-branch.c index d208fd6c6..90fc6b1b9 100644 --- a/builtin/show-branch.c +++ b/builtin/show-branch.c @@ -162,29 +162,28 @@ static void name_commits(struct commit_list *list, nth = 0; while (parents) { struct commit *p = parents->item; - char newname[1000], *en; + struct strbuf newname = STRBUF_INIT; parents = parents->next; nth++; if (p->util) continue; - en = newname; switch (n->generation) { case 0: - en += sprintf(en, "%s", n->head_name); + strbuf_addstr(&newname, n->head_name); break; case 1: - en += sprintf(en, "%s^", n->head_name); + strbuf_addf(&newname, "%s^", n->head_name); break; default: - en += sprintf(en, "%s~%d", - n->head_name, n->generation); + strbuf_addf(&newname, "%s~%d", + n->head_name, n->generation); break; } if (nth == 1) - en += sprintf(en, "^"); + strbuf_addch(&newname, '^'); else - en += sprintf(en, "^%d", nth); - name_commit(p, xstrdup(newname), 0); + strbuf_addf(&newname, "^%d", nth); + name_commit(p, strbuf_detach(&newname, NULL), 0); i++; name_first_parent_chain(p); } |