diff options
author | Miklos Vajna <vmiklos@frugalware.org> | 2008-11-17 21:48:37 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-11-18 15:46:42 -0800 |
commit | da3f78a29cafee487c107a81c442213fa41463f7 (patch) | |
tree | 53cc35445e094d49a24599cf890f4354499d34a5 | |
parent | d3f9f9a92eca0dd6379d836a083e823cc5e3eeb6 (diff) | |
download | git-da3f78a29cafee487c107a81c442213fa41463f7.tar.gz git-da3f78a29cafee487c107a81c442213fa41463f7.tar.xz |
builtin-branch: use strbuf in rename_branch()
In case the length of branch name is greather then PATH_MAX-11, we write
to unallocated memory otherwise.
Signed-off-by: Miklos Vajna <vmiklos@frugalware.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | builtin-branch.c | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/builtin-branch.c b/builtin-branch.c index c8a8e2a2f..494cbac00 100644 --- a/builtin-branch.c +++ b/builtin-branch.c @@ -424,42 +424,45 @@ static void print_ref_list(int kinds, int detached, int verbose, int abbrev, str static void rename_branch(const char *oldname, const char *newname, int force) { - char oldref[PATH_MAX], newref[PATH_MAX], logmsg[PATH_MAX*2 + 100]; + struct strbuf oldref = STRBUF_INIT, newref = STRBUF_INIT, logmsg = STRBUF_INIT; unsigned char sha1[20]; - char oldsection[PATH_MAX], newsection[PATH_MAX]; + struct strbuf oldsection = STRBUF_INIT, newsection = STRBUF_INIT; if (!oldname) die("cannot rename the current branch while not on any."); - if (snprintf(oldref, sizeof(oldref), "refs/heads/%s", oldname) > sizeof(oldref)) - die("Old branchname too long"); + strbuf_addf(&oldref, "refs/heads/%s", oldname); - if (check_ref_format(oldref)) - die("Invalid branch name: %s", oldref); + if (check_ref_format(oldref.buf)) + die("Invalid branch name: %s", oldref.buf); - if (snprintf(newref, sizeof(newref), "refs/heads/%s", newname) > sizeof(newref)) - die("New branchname too long"); + strbuf_addf(&newref, "refs/heads/%s", newname); - if (check_ref_format(newref)) - die("Invalid branch name: %s", newref); + if (check_ref_format(newref.buf)) + die("Invalid branch name: %s", newref.buf); - if (resolve_ref(newref, sha1, 1, NULL) && !force) + if (resolve_ref(newref.buf, sha1, 1, NULL) && !force) die("A branch named '%s' already exists.", newname); - snprintf(logmsg, sizeof(logmsg), "Branch: renamed %s to %s", - oldref, newref); + strbuf_addf(&logmsg, "Branch: renamed %s to %s", + oldref.buf, newref.buf); - if (rename_ref(oldref, newref, logmsg)) + if (rename_ref(oldref.buf, newref.buf, logmsg.buf)) die("Branch rename failed"); + strbuf_release(&logmsg); /* no need to pass logmsg here as HEAD didn't really move */ - if (!strcmp(oldname, head) && create_symref("HEAD", newref, NULL)) + if (!strcmp(oldname, head) && create_symref("HEAD", newref.buf, NULL)) die("Branch renamed to %s, but HEAD is not updated!", newname); - snprintf(oldsection, sizeof(oldsection), "branch.%s", oldref + 11); - snprintf(newsection, sizeof(newsection), "branch.%s", newref + 11); - if (git_config_rename_section(oldsection, newsection) < 0) + strbuf_addf(&oldsection, "branch.%s", oldref.buf + 11); + strbuf_release(&oldref); + strbuf_addf(&newsection, "branch.%s", newref.buf + 11); + strbuf_release(&newref); + if (git_config_rename_section(oldsection.buf, newsection.buf) < 0) die("Branch is renamed, but update of config-file failed"); + strbuf_release(&oldsection); + strbuf_release(&newsection); } static int opt_parse_with_commit(const struct option *opt, const char *arg, int unset) |