lockfile API users: simplify and don't leak "path"
Fix a memory leak in code added in6c622f9f0b(commit-graph: write commit-graph chains, 2019-06-18). We needed to free the "lock_name" if we encounter errors, and the "graph_name" after we'd run unlink() on it. For the case of write_commit_graph_file() refactoring the code to free the "lock_name" after we were done using the "struct lock_file lk" would have made the control flow more complex. Luckily we can free the "lock_file" right after the hold_lock_file_for_update() call, if it makes use of "path" at all it'll have copied its contents to a "struct strbuf" of its own. While I'm at it let's fix code added infb10ca5b54(sparse-checkout: write using lockfile, 2019-11-21) in write_patterns_and_update() to avoid the same complexity that I thought I needed when I wrote the initial fix for write_commit_graph_file(). We can free the "sparse_filename" right after calling hold_lock_file_for_update(), we don't need to wait until we're exiting the function to do so. Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
		 Ævar Arnfjörð Bjarmason
					Ævar Arnfjörð Bjarmason
				
			
				
					committed by
					
						 Junio C Hamano
						Junio C Hamano
					
				
			
			
				
	
			
			
			 Junio C Hamano
						Junio C Hamano
					
				
			
						parent
						
							51a94d8ffe
						
					
				
				
					commit
					ef3fe21448
				
			| @ -328,11 +328,11 @@ static int write_patterns_and_update(struct pattern_list *pl) | |||||||
|  |  | ||||||
| 	fd = hold_lock_file_for_update(&lk, sparse_filename, | 	fd = hold_lock_file_for_update(&lk, sparse_filename, | ||||||
| 				      LOCK_DIE_ON_ERROR); | 				      LOCK_DIE_ON_ERROR); | ||||||
|  | 	free(sparse_filename); | ||||||
|  |  | ||||||
| 	result = update_working_directory(pl); | 	result = update_working_directory(pl); | ||||||
| 	if (result) { | 	if (result) { | ||||||
| 		rollback_lock_file(&lk); | 		rollback_lock_file(&lk); | ||||||
| 		free(sparse_filename); |  | ||||||
| 		clear_pattern_list(pl); | 		clear_pattern_list(pl); | ||||||
| 		update_working_directory(NULL); | 		update_working_directory(NULL); | ||||||
| 		return result; | 		return result; | ||||||
| @ -348,7 +348,6 @@ static int write_patterns_and_update(struct pattern_list *pl) | |||||||
| 	fflush(fp); | 	fflush(fp); | ||||||
| 	commit_lock_file(&lk); | 	commit_lock_file(&lk); | ||||||
|  |  | ||||||
| 	free(sparse_filename); |  | ||||||
| 	clear_pattern_list(pl); | 	clear_pattern_list(pl); | ||||||
|  |  | ||||||
| 	return 0; | 	return 0; | ||||||
|  | |||||||
| @ -1854,6 +1854,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx) | |||||||
|  |  | ||||||
| 		hold_lock_file_for_update_mode(&lk, lock_name, | 		hold_lock_file_for_update_mode(&lk, lock_name, | ||||||
| 					       LOCK_DIE_ON_ERROR, 0444); | 					       LOCK_DIE_ON_ERROR, 0444); | ||||||
|  | 		free(lock_name); | ||||||
|  |  | ||||||
| 		fd = git_mkstemp_mode(ctx->graph_name, 0444); | 		fd = git_mkstemp_mode(ctx->graph_name, 0444); | ||||||
| 		if (fd < 0) { | 		if (fd < 0) { | ||||||
| @ -1978,6 +1979,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx) | |||||||
| 		} else { | 		} else { | ||||||
| 			char *graph_name = get_commit_graph_filename(ctx->odb); | 			char *graph_name = get_commit_graph_filename(ctx->odb); | ||||||
| 			unlink(graph_name); | 			unlink(graph_name); | ||||||
|  | 			free(graph_name); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		ctx->commit_graph_hash_after[ctx->num_commit_graphs_after - 1] = xstrdup(hash_to_hex(file_hash)); | 		ctx->commit_graph_hash_after[ctx->num_commit_graphs_after - 1] = xstrdup(hash_to_hex(file_hash)); | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user