diff options
author | Junio C Hamano <gitster@pobox.com> | 2023-11-02 16:53:26 +0900 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2023-11-02 16:53:26 +0900 |
commit | f92cea12c91b3ea76abc0ee88ac61cebad68c145 (patch) | |
tree | b997a0c5ca79b6f12ba3d176b37c3aeb47b0a47e | |
parent | 1e315cab447fb32e3df7749de7dedcf42b2659d8 (diff) | |
parent | badf2fe1c31f939cac5ea229bba8de273af132d9 (diff) | |
download | git-f92cea12c91b3ea76abc0ee88ac61cebad68c145.tar.gz |
Merge branch 'jk/decoration-and-other-leak-fixes' into maint-2.42
Leakfix.
* jk/decoration-and-other-leak-fixes:
daemon: free listen_addr before returning
revision: clear decoration structs during release_revisions()
decorate: add clear_decoration() function
-rw-r--r-- | daemon.c | 37 | ||||
-rw-r--r-- | decorate.c | 15 | ||||
-rw-r--r-- | decorate.h | 10 | ||||
-rw-r--r-- | line-log.c | 10 | ||||
-rw-r--r-- | line-log.h | 2 | ||||
-rw-r--r-- | revision.c | 9 | ||||
-rw-r--r-- | t/helper/test-example-decorate.c | 2 | ||||
-rwxr-xr-x | t/t4217-log-limit.sh | 1 | ||||
-rwxr-xr-x | t/t5811-proto-disable-git.sh | 2 | ||||
-rwxr-xr-x | t/t9004-example.sh | 2 |
10 files changed, 74 insertions, 16 deletions
@@ -1243,19 +1243,20 @@ static int serve(struct string_list *listen_addr, int listen_port, int cmd_main(int argc, const char **argv) { int listen_port = 0; - struct string_list listen_addr = STRING_LIST_INIT_NODUP; + struct string_list listen_addr = STRING_LIST_INIT_DUP; int serve_mode = 0, inetd_mode = 0; const char *pid_file = NULL, *user_name = NULL, *group_name = NULL; int detach = 0; struct credentials *cred = NULL; int i; + int ret; for (i = 1; i < argc; i++) { const char *arg = argv[i]; const char *v; if (skip_prefix(arg, "--listen=", &v)) { - string_list_append(&listen_addr, xstrdup_tolower(v)); + string_list_append_nodup(&listen_addr, xstrdup_tolower(v)); continue; } if (skip_prefix(arg, "--port=", &v)) { @@ -1437,22 +1438,26 @@ int cmd_main(int argc, const char **argv) die_errno("failed to redirect stderr to /dev/null"); } - if (inetd_mode || serve_mode) - return execute(); + if (inetd_mode || serve_mode) { + ret = execute(); + } else { + if (detach) { + if (daemonize()) + die("--detach not supported on this platform"); + } - if (detach) { - if (daemonize()) - die("--detach not supported on this platform"); - } + if (pid_file) + write_file(pid_file, "%"PRIuMAX, (uintmax_t) getpid()); - if (pid_file) - write_file(pid_file, "%"PRIuMAX, (uintmax_t) getpid()); + /* prepare argv for serving-processes */ + strvec_push(&cld_argv, argv[0]); /* git-daemon */ + strvec_push(&cld_argv, "--serve"); + for (i = 1; i < argc; ++i) + strvec_push(&cld_argv, argv[i]); - /* prepare argv for serving-processes */ - strvec_push(&cld_argv, argv[0]); /* git-daemon */ - strvec_push(&cld_argv, "--serve"); - for (i = 1; i < argc; ++i) - strvec_push(&cld_argv, argv[i]); + ret = serve(&listen_addr, listen_port, cred); + } - return serve(&listen_addr, listen_port, cred); + string_list_clear(&listen_addr, 0); + return ret; } diff --git a/decorate.c b/decorate.c index a5c43c0c14..69aeb142b4 100644 --- a/decorate.c +++ b/decorate.c @@ -81,3 +81,18 @@ void *lookup_decoration(struct decoration *n, const struct object *obj) j = 0; } } + +void clear_decoration(struct decoration *n, void (*free_cb)(void *)) +{ + if (free_cb) { + unsigned int i; + for (i = 0; i < n->size; i++) { + void *d = n->entries[i].decoration; + if (d) + free_cb(d); + } + } + + FREE_AND_NULL(n->entries); + n->size = n->nr = 0; +} diff --git a/decorate.h b/decorate.h index ee43dee1f0..cdeb17c9df 100644 --- a/decorate.h +++ b/decorate.h @@ -58,4 +58,14 @@ void *add_decoration(struct decoration *n, const struct object *obj, void *decor */ void *lookup_decoration(struct decoration *n, const struct object *obj); +/* + * Clear all decoration entries, releasing any memory used by the structure. + * If free_cb is not NULL, it is called for every decoration value currently + * stored. + * + * After clearing, the decoration struct can be used again. The "name" field is + * retained. + */ +void clear_decoration(struct decoration *n, void (*free_cb)(void *)); + #endif diff --git a/line-log.c b/line-log.c index 790ab73212..24a1ecb677 100644 --- a/line-log.c +++ b/line-log.c @@ -1327,3 +1327,13 @@ int line_log_filter(struct rev_info *rev) return 0; } + +static void free_void_line_log_data(void *data) +{ + free_line_log_data(data); +} + +void line_log_free(struct rev_info *rev) +{ + clear_decoration(&rev->line_log_data, free_void_line_log_data); +} diff --git a/line-log.h b/line-log.h index adff361b1b..4291da8d79 100644 --- a/line-log.h +++ b/line-log.h @@ -60,4 +60,6 @@ int line_log_process_ranges_arbitrary_commit(struct rev_info *rev, int line_log_print(struct rev_info *rev, struct commit *commit); +void line_log_free(struct rev_info *rev); + #endif /* LINE_LOG_H */ diff --git a/revision.c b/revision.c index 2f4c53ea20..0ae1c76db3 100644 --- a/revision.c +++ b/revision.c @@ -3076,6 +3076,11 @@ static void release_revisions_mailmap(struct string_list *mailmap) static void release_revisions_topo_walk_info(struct topo_walk_info *info); +static void free_void_commit_list(void *list) +{ + free_commit_list(list); +} + void release_revisions(struct rev_info *revs) { free_commit_list(revs->commits); @@ -3093,6 +3098,10 @@ void release_revisions(struct rev_info *revs) diff_free(&revs->pruning); reflog_walk_info_release(revs->reflog_info); release_revisions_topo_walk_info(revs->topo_walk_info); + clear_decoration(&revs->children, free_void_commit_list); + clear_decoration(&revs->merge_simplification, free); + clear_decoration(&revs->treesame, free); + line_log_free(revs); } static void add_child(struct rev_info *revs, struct commit *parent, struct commit *child) diff --git a/t/helper/test-example-decorate.c b/t/helper/test-example-decorate.c index 2ed910adaa..8f59f6be4c 100644 --- a/t/helper/test-example-decorate.c +++ b/t/helper/test-example-decorate.c @@ -72,5 +72,7 @@ int cmd__example_decorate(int argc UNUSED, const char **argv UNUSED) if (objects_noticed != 2) BUG("should have 2 objects"); + clear_decoration(&n, NULL); + return 0; } diff --git a/t/t4217-log-limit.sh b/t/t4217-log-limit.sh index 6e01e2629c..613f0710e9 100755 --- a/t/t4217-log-limit.sh +++ b/t/t4217-log-limit.sh @@ -2,6 +2,7 @@ test_description='git log with filter options limiting the output' +TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh test_expect_success 'setup test' ' diff --git a/t/t5811-proto-disable-git.sh b/t/t5811-proto-disable-git.sh index 8ac6b2a1d0..ed773e7432 100755 --- a/t/t5811-proto-disable-git.sh +++ b/t/t5811-proto-disable-git.sh @@ -1,6 +1,8 @@ #!/bin/sh test_description='test disabling of git-over-tcp in clone/fetch' + +TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh . "$TEST_DIRECTORY/lib-proto-disable.sh" . "$TEST_DIRECTORY/lib-git-daemon.sh" diff --git a/t/t9004-example.sh b/t/t9004-example.sh index 7e8894a4a7..590aab0304 100755 --- a/t/t9004-example.sh +++ b/t/t9004-example.sh @@ -1,6 +1,8 @@ #!/bin/sh test_description='check that example code compiles and runs' + +TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh test_expect_success 'decorate' ' |