Fix small memory leaks induced by diff_tree_setup_paths
Run diff_tree_release_paths in the appropriate places, and add a test to avoid NULL dereference. Better safe than sorry. Signed-off-by: Mike Hommey <mh@glandium.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									b0fe0d7258
								
							
						
					
					
						commit
						03b69c7606
					
				|  | @ -388,6 +388,7 @@ static struct origin *find_origin(struct scoreboard *sb, | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	diff_flush(&diff_opts); | 	diff_flush(&diff_opts); | ||||||
|  | 	diff_tree_release_paths(&diff_opts); | ||||||
| 	if (porigin) { | 	if (porigin) { | ||||||
| 		/* | 		/* | ||||||
| 		 * Create a freestanding copy that is not part of | 		 * Create a freestanding copy that is not part of | ||||||
|  | @ -444,6 +445,7 @@ static struct origin *find_rename(struct scoreboard *sb, | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	diff_flush(&diff_opts); | 	diff_flush(&diff_opts); | ||||||
|  | 	diff_tree_release_paths(&diff_opts); | ||||||
| 	return porigin; | 	return porigin; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1165,7 +1167,7 @@ static int find_copy_in_parent(struct scoreboard *sb, | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	diff_flush(&diff_opts); | 	diff_flush(&diff_opts); | ||||||
|  | 	diff_tree_release_paths(&diff_opts); | ||||||
| 	return retval; | 	return retval; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -158,6 +158,7 @@ static int read_from_tree(const char *prefix, const char **argv, | ||||||
| 		return 1; | 		return 1; | ||||||
| 	diffcore_std(&opt); | 	diffcore_std(&opt); | ||||||
| 	diff_flush(&opt); | 	diff_flush(&opt); | ||||||
|  | 	diff_tree_release_paths(&opt); | ||||||
|  |  | ||||||
| 	if (!index_was_discarded) | 	if (!index_was_discarded) | ||||||
| 		/* The index is still clobbered from do_diff_cache() */ | 		/* The index is still clobbered from do_diff_cache() */ | ||||||
|  |  | ||||||
|  | @ -326,6 +326,7 @@ static void try_to_follow_renames(struct tree_desc *t1, struct tree_desc *t2, co | ||||||
| 		die("unable to set up diff options to follow renames"); | 		die("unable to set up diff options to follow renames"); | ||||||
| 	diff_tree(t1, t2, base, &diff_opts); | 	diff_tree(t1, t2, base, &diff_opts); | ||||||
| 	diffcore_std(&diff_opts); | 	diffcore_std(&diff_opts); | ||||||
|  | 	diff_tree_release_paths(&diff_opts); | ||||||
|  |  | ||||||
| 	/* Go through the new set of filepairing, and see if we find a more interesting one */ | 	/* Go through the new set of filepairing, and see if we find a more interesting one */ | ||||||
| 	for (i = 0; i < q->nr; i++) { | 	for (i = 0; i < q->nr; i++) { | ||||||
|  | @ -342,6 +343,7 @@ static void try_to_follow_renames(struct tree_desc *t1, struct tree_desc *t2, co | ||||||
| 			choice = p; | 			choice = p; | ||||||
|  |  | ||||||
| 			/* Update the path we use from now on.. */ | 			/* Update the path we use from now on.. */ | ||||||
|  | 			diff_tree_release_paths(opt); | ||||||
| 			opt->paths[0] = xstrdup(p->one->path); | 			opt->paths[0] = xstrdup(p->one->path); | ||||||
| 			diff_tree_setup_paths(opt->paths, opt); | 			diff_tree_setup_paths(opt->paths, opt); | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Mike Hommey
						Mike Hommey