Merge branch 'jk/decoration-and-other-leak-fixes'
Leakfix. * jk/decoration-and-other-leak-fixes: daemon: free listen_addr before returning revision: clear decoration structs during release_revisions() decorate: add clear_decoration() functionmaint
						commit
						2920971a7f
					
				
							
								
								
									
										17
									
								
								daemon.c
								
								
								
								
							
							
						
						
									
										17
									
								
								daemon.c
								
								
								
								
							|  | @ -1243,19 +1243,20 @@ static int serve(struct string_list *listen_addr, int listen_port, | ||||||
| int cmd_main(int argc, const char **argv) | int cmd_main(int argc, const char **argv) | ||||||
| { | { | ||||||
| 	int listen_port = 0; | 	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; | 	int serve_mode = 0, inetd_mode = 0; | ||||||
| 	const char *pid_file = NULL, *user_name = NULL, *group_name = NULL; | 	const char *pid_file = NULL, *user_name = NULL, *group_name = NULL; | ||||||
| 	int detach = 0; | 	int detach = 0; | ||||||
| 	struct credentials *cred = NULL; | 	struct credentials *cred = NULL; | ||||||
| 	int i; | 	int i; | ||||||
|  | 	int ret; | ||||||
|  |  | ||||||
| 	for (i = 1; i < argc; i++) { | 	for (i = 1; i < argc; i++) { | ||||||
| 		const char *arg = argv[i]; | 		const char *arg = argv[i]; | ||||||
| 		const char *v; | 		const char *v; | ||||||
|  |  | ||||||
| 		if (skip_prefix(arg, "--listen=", &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; | 			continue; | ||||||
| 		} | 		} | ||||||
| 		if (skip_prefix(arg, "--port=", &v)) { | 		if (skip_prefix(arg, "--port=", &v)) { | ||||||
|  | @ -1437,9 +1438,9 @@ int cmd_main(int argc, const char **argv) | ||||||
| 			die_errno("failed to redirect stderr to /dev/null"); | 			die_errno("failed to redirect stderr to /dev/null"); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (inetd_mode || serve_mode) | 	if (inetd_mode || serve_mode) { | ||||||
| 		return execute(); | 		ret = execute(); | ||||||
|  | 	} else { | ||||||
| 		if (detach) { | 		if (detach) { | ||||||
| 			if (daemonize()) | 			if (daemonize()) | ||||||
| 				die("--detach not supported on this platform"); | 				die("--detach not supported on this platform"); | ||||||
|  | @ -1454,5 +1455,9 @@ int cmd_main(int argc, const char **argv) | ||||||
| 		for (i = 1; i < argc; ++i) | 		for (i = 1; i < argc; ++i) | ||||||
| 			strvec_push(&cld_argv, argv[i]); | 			strvec_push(&cld_argv, argv[i]); | ||||||
|  |  | ||||||
| 	return serve(&listen_addr, listen_port, cred); | 		ret = serve(&listen_addr, listen_port, cred); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	string_list_clear(&listen_addr, 0); | ||||||
|  | 	return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										15
									
								
								decorate.c
								
								
								
								
							
							
						
						
									
										15
									
								
								decorate.c
								
								
								
								
							|  | @ -81,3 +81,18 @@ void *lookup_decoration(struct decoration *n, const struct object *obj) | ||||||
| 			j = 0; | 			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; | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										10
									
								
								decorate.h
								
								
								
								
							
							
						
						
									
										10
									
								
								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); | 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 | #endif | ||||||
|  |  | ||||||
							
								
								
									
										10
									
								
								line-log.c
								
								
								
								
							
							
						
						
									
										10
									
								
								line-log.c
								
								
								
								
							|  | @ -1327,3 +1327,13 @@ int line_log_filter(struct rev_info *rev) | ||||||
|  |  | ||||||
| 	return 0; | 	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); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -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); | int line_log_print(struct rev_info *rev, struct commit *commit); | ||||||
|  |  | ||||||
|  | void line_log_free(struct rev_info *rev); | ||||||
|  |  | ||||||
| #endif /* LINE_LOG_H */ | #endif /* LINE_LOG_H */ | ||||||
|  |  | ||||||
|  | @ -3083,6 +3083,11 @@ static void release_revisions_mailmap(struct string_list *mailmap) | ||||||
|  |  | ||||||
| static void release_revisions_topo_walk_info(struct topo_walk_info *info); | 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) | void release_revisions(struct rev_info *revs) | ||||||
| { | { | ||||||
| 	free_commit_list(revs->commits); | 	free_commit_list(revs->commits); | ||||||
|  | @ -3100,6 +3105,10 @@ void release_revisions(struct rev_info *revs) | ||||||
| 	diff_free(&revs->pruning); | 	diff_free(&revs->pruning); | ||||||
| 	reflog_walk_info_release(revs->reflog_info); | 	reflog_walk_info_release(revs->reflog_info); | ||||||
| 	release_revisions_topo_walk_info(revs->topo_walk_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) | static void add_child(struct rev_info *revs, struct commit *parent, struct commit *child) | ||||||
|  |  | ||||||
|  | @ -72,5 +72,7 @@ int cmd__example_decorate(int argc UNUSED, const char **argv UNUSED) | ||||||
| 	if (objects_noticed != 2) | 	if (objects_noticed != 2) | ||||||
| 		BUG("should have 2 objects"); | 		BUG("should have 2 objects"); | ||||||
|  |  | ||||||
|  | 	clear_decoration(&n, NULL); | ||||||
|  |  | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
|  |  | ||||||
| test_description='git log with filter options limiting the output' | test_description='git log with filter options limiting the output' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'setup test' ' | test_expect_success 'setup test' ' | ||||||
|  |  | ||||||
|  | @ -1,6 +1,8 @@ | ||||||
| #!/bin/sh | #!/bin/sh | ||||||
|  |  | ||||||
| test_description='test disabling of git-over-tcp in clone/fetch' | test_description='test disabling of git-over-tcp in clone/fetch' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
| . "$TEST_DIRECTORY/lib-proto-disable.sh" | . "$TEST_DIRECTORY/lib-proto-disable.sh" | ||||||
| . "$TEST_DIRECTORY/lib-git-daemon.sh" | . "$TEST_DIRECTORY/lib-git-daemon.sh" | ||||||
|  |  | ||||||
|  | @ -1,6 +1,8 @@ | ||||||
| #!/bin/sh | #!/bin/sh | ||||||
|  |  | ||||||
| test_description='check that example code compiles and runs' | test_description='check that example code compiles and runs' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'decorate' ' | test_expect_success 'decorate' ' | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano