Skip to content

Commit 4ce14e1

Browse files
pks-tgitster
authored andcommitted
setup: refactor upgrade_repository_format() to have common exit
The `upgrade_repository_format()` function has multiple exit paths, which means that there is no common cleanup of acquired resources. While this isn't much of a problem right now, we're about to fix a memory leak that would require us to free the resource in every one of those exit paths. Refactor the code to have a common exit path so that the subsequent memory leak fix becomes easier to implement. Signed-off-by: Patrick Steinhardt <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 568cc81 commit 4ce14e1

File tree

1 file changed

+20
-11
lines changed

1 file changed

+20
-11
lines changed

setup.c

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -693,29 +693,38 @@ int upgrade_repository_format(int target_version)
693693
struct strbuf err = STRBUF_INIT;
694694
struct strbuf repo_version = STRBUF_INIT;
695695
struct repository_format repo_fmt = REPOSITORY_FORMAT_INIT;
696+
int ret;
696697

697698
strbuf_git_common_path(&sb, the_repository, "config");
698699
read_repository_format(&repo_fmt, sb.buf);
699700
strbuf_release(&sb);
700701

701-
if (repo_fmt.version >= target_version)
702-
return 0;
702+
if (repo_fmt.version >= target_version) {
703+
ret = 0;
704+
goto out;
705+
}
703706

704707
if (verify_repository_format(&repo_fmt, &err) < 0) {
705-
error("cannot upgrade repository format from %d to %d: %s",
706-
repo_fmt.version, target_version, err.buf);
707-
strbuf_release(&err);
708-
return -1;
708+
ret = error("cannot upgrade repository format from %d to %d: %s",
709+
repo_fmt.version, target_version, err.buf);
710+
goto out;
711+
}
712+
if (!repo_fmt.version && repo_fmt.unknown_extensions.nr) {
713+
ret = error("cannot upgrade repository format: "
714+
"unknown extension %s",
715+
repo_fmt.unknown_extensions.items[0].string);
716+
goto out;
709717
}
710-
if (!repo_fmt.version && repo_fmt.unknown_extensions.nr)
711-
return error("cannot upgrade repository format: "
712-
"unknown extension %s",
713-
repo_fmt.unknown_extensions.items[0].string);
714718

715719
strbuf_addf(&repo_version, "%d", target_version);
716720
git_config_set("core.repositoryformatversion", repo_version.buf);
721+
722+
ret = 1;
723+
724+
out:
717725
strbuf_release(&repo_version);
718-
return 1;
726+
strbuf_release(&err);
727+
return ret;
719728
}
720729

721730
static void init_repository_format(struct repository_format *format)

0 commit comments

Comments
 (0)