From d5e1961c19a2b638a700d03729cbb6c27fe5a3e8 Mon Sep 17 00:00:00 2001 From: Jeff King Date: Thu, 13 Aug 2020 11:55:00 -0400 Subject: stop calling UNLEAK() before die() The point of UNLEAK() is to make a reference to a variable that is about to go out of scope so that leak-checkers will consider it to be not-leaked. Doing so right before die() is therefore pointless; even though we are about to exit the program, the variable will still be on the stack and accessible to leak-checkers. These annotations aren't really hurting anything, but they clutter the code and set a bad example of how to use UNLEAK(). Signed-off-by: Jeff King Signed-off-by: Junio C Hamano diff --git a/bugreport.c b/bugreport.c index 09579e2..7ca0fba 100644 --- a/bugreport.c +++ b/bugreport.c @@ -175,10 +175,8 @@ int cmd_main(int argc, const char **argv) /* fopen doesn't offer us an O_EXCL alternative, except with glibc. */ report = open(report_path.buf, O_CREAT | O_EXCL | O_WRONLY, 0666); - if (report < 0) { - UNLEAK(report_path); + if (report < 0) die(_("couldn't create a new file at '%s'"), report_path.buf); - } if (write_in_full(report, buffer.buf, buffer.len) < 0) die_errno(_("unable to write to %s"), report_path.buf); diff --git a/midx.c b/midx.c index 6d1584c..8af46e8 100644 --- a/midx.c +++ b/midx.c @@ -807,11 +807,9 @@ static int write_midx_internal(const char *object_dir, struct multi_pack_index * int result = 0; midx_name = get_midx_filename(object_dir); - if (safe_create_leading_directories(midx_name)) { - UNLEAK(midx_name); + if (safe_create_leading_directories(midx_name)) die_errno(_("unable to create leading directories of %s"), midx_name); - } if (m) packs.m = m; @@ -1051,10 +1049,8 @@ void clear_midx_file(struct repository *r) r->objects->multi_pack_index = NULL; } - if (remove_path(midx)) { - UNLEAK(midx); + if (remove_path(midx)) die(_("failed to clear multi-pack-index at %s"), midx); - } free(midx); } -- cgit v0.10.2-6-g49f6 From 3e19816dc044a4aca4a15276c92f804c44d0f65f Mon Sep 17 00:00:00 2001 From: Jeff King Date: Thu, 13 Aug 2020 11:55:51 -0400 Subject: ls-remote: simplify UNLEAK() usage We UNLEAK() the "sorting" list created by parsing command-line options (which is essentially used until the program exits). But we do so right before leaving the cmd_ls_remote() function, which means we have to hit all of the exits. But the point of UNLEAK() is that it's an annotation which doesn't impact the variable itself. We can mark it as soon as we're done writing its value, and then we only have to do so once. This gives us a minor code reduction, and serves as a better example of how UNLEAK() can be used. Signed-off-by: Jeff King Signed-off-by: Junio C Hamano diff --git a/builtin/ls-remote.c b/builtin/ls-remote.c index 3a4dd12..5f969eb 100644 --- a/builtin/ls-remote.c +++ b/builtin/ls-remote.c @@ -83,6 +83,8 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) PARSE_OPT_STOP_AT_NON_OPTION); dest = argv[0]; + UNLEAK(sorting); + if (argc > 1) { int i; pattern = xcalloc(argc, sizeof(const char *)); @@ -107,7 +109,6 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) if (get_url) { printf("%s\n", *remote->url); - UNLEAK(sorting); return 0; } @@ -122,10 +123,8 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) int hash_algo = hash_algo_by_ptr(transport_get_hash_algo(transport)); repo_set_hash_algo(the_repository, hash_algo); } - if (transport_disconnect(transport)) { - UNLEAK(sorting); + if (transport_disconnect(transport)) return 1; - } if (!dest && !quiet) fprintf(stderr, "From %s\n", *remote->url); @@ -150,7 +149,6 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) status = 0; /* we found something */ } - UNLEAK(sorting); ref_array_clear(&ref_array); return status; } -- cgit v0.10.2-6-g49f6