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 <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Patrick Steinhardt committed
Nov 6, 2023 at 11:46 UTC
4ce14e13250e824b7d410d9bff88061525346a15
1 file changed
+20
-11
setup.c
+20
-11
@@ -693,29 +693,38 @@ int upgrade_repository_format(int target_version)
693
struct strbuf err = STRBUF_INIT;
694
struct strbuf repo_version = STRBUF_INIT;
695
struct repository_format repo_fmt = REPOSITORY_FORMAT_INIT;
696
+ int ret;
697
698
strbuf_git_common_path(&sb, the_repository, "config");
699
read_repository_format(&repo_fmt, sb.buf);
700
strbuf_release(&sb);
701
701
- if (repo_fmt.version >= target_version)
702
- return 0;
702
+ if (repo_fmt.version >= target_version) {
703
+ ret = 0;
704
+ goto out;
705
+ }
706
707
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;
717
}
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);
718
719
strbuf_addf(&repo_version, "%d", target_version);
720
git_config_set("core.repositoryformatversion", repo_version.buf);
721
+
722
+ ret = 1;
723
+
724
+out:
725
strbuf_release(&repo_version);
718
- return 1;
726
+ strbuf_release(&err);
727
+ return ret;
728
}
729
730
static void init_repository_format(struct repository_format *format)