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>
This commit is contained in:
Miklos Vajna 2008-11-17 21:48:37 +01:00 коммит произвёл Junio C Hamano
Родитель d3f9f9a92e
Коммит da3f78a29c
1 изменённых файлов: 21 добавлений и 18 удалений

Просмотреть файл

@ -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) 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]; unsigned char sha1[20];
char oldsection[PATH_MAX], newsection[PATH_MAX]; struct strbuf oldsection = STRBUF_INIT, newsection = STRBUF_INIT;
if (!oldname) if (!oldname)
die("cannot rename the current branch while not on any."); die("cannot rename the current branch while not on any.");
if (snprintf(oldref, sizeof(oldref), "refs/heads/%s", oldname) > sizeof(oldref)) strbuf_addf(&oldref, "refs/heads/%s", oldname);
die("Old branchname too long");
if (check_ref_format(oldref)) if (check_ref_format(oldref.buf))
die("Invalid branch name: %s", oldref); die("Invalid branch name: %s", oldref.buf);
if (snprintf(newref, sizeof(newref), "refs/heads/%s", newname) > sizeof(newref)) strbuf_addf(&newref, "refs/heads/%s", newname);
die("New branchname too long");
if (check_ref_format(newref)) if (check_ref_format(newref.buf))
die("Invalid branch name: %s", newref); 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); die("A branch named '%s' already exists.", newname);
snprintf(logmsg, sizeof(logmsg), "Branch: renamed %s to %s", strbuf_addf(&logmsg, "Branch: renamed %s to %s",
oldref, newref); oldref.buf, newref.buf);
if (rename_ref(oldref, newref, logmsg)) if (rename_ref(oldref.buf, newref.buf, logmsg.buf))
die("Branch rename failed"); die("Branch rename failed");
strbuf_release(&logmsg);
/* no need to pass logmsg here as HEAD didn't really move */ /* 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); die("Branch renamed to %s, but HEAD is not updated!", newname);
snprintf(oldsection, sizeof(oldsection), "branch.%s", oldref + 11); strbuf_addf(&oldsection, "branch.%s", oldref.buf + 11);
snprintf(newsection, sizeof(newsection), "branch.%s", newref + 11); strbuf_release(&oldref);
if (git_config_rename_section(oldsection, newsection) < 0) 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"); 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) static int opt_parse_with_commit(const struct option *opt, const char *arg, int unset)