зеркало из https://github.com/microsoft/git.git
Merge branch 'jc/dirstat-plug-leaks'
"git diff --dirstat" leaked memory, which has been plugged. * jc/dirstat-plug-leaks: diff: plug leaks in dirstat diff: refactor common tail part of dirstat computation
This commit is contained in:
Коммит
1e1dcb2a42
34
diff.c
34
diff.c
|
@ -3007,6 +3007,24 @@ static int dirstat_compare(const void *_a, const void *_b)
|
||||||
return strcmp(a->name, b->name);
|
return strcmp(a->name, b->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void conclude_dirstat(struct diff_options *options,
|
||||||
|
struct dirstat_dir *dir,
|
||||||
|
unsigned long changed)
|
||||||
|
{
|
||||||
|
struct dirstat_file *to_free = dir->files;
|
||||||
|
|
||||||
|
if (!changed) {
|
||||||
|
/* This can happen even with many files, if everything was renames */
|
||||||
|
;
|
||||||
|
} else {
|
||||||
|
/* Show all directories with more than x% of the changes */
|
||||||
|
QSORT(dir->files, dir->nr, dirstat_compare);
|
||||||
|
gather_dirstat(options, dir, changed, "", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(to_free);
|
||||||
|
}
|
||||||
|
|
||||||
static void show_dirstat(struct diff_options *options)
|
static void show_dirstat(struct diff_options *options)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -3096,13 +3114,7 @@ found_damage:
|
||||||
dir.nr++;
|
dir.nr++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This can happen even with many files, if everything was renames */
|
conclude_dirstat(options, &dir, changed);
|
||||||
if (!changed)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Show all directories with more than x% of the changes */
|
|
||||||
QSORT(dir.files, dir.nr, dirstat_compare);
|
|
||||||
gather_dirstat(options, &dir, changed, "", 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void show_dirstat_by_line(struct diffstat_t *data, struct diff_options *options)
|
static void show_dirstat_by_line(struct diffstat_t *data, struct diff_options *options)
|
||||||
|
@ -3140,13 +3152,7 @@ static void show_dirstat_by_line(struct diffstat_t *data, struct diff_options *o
|
||||||
dir.nr++;
|
dir.nr++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This can happen even with many files, if everything was renames */
|
conclude_dirstat(options, &dir, changed);
|
||||||
if (!changed)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Show all directories with more than x% of the changes */
|
|
||||||
QSORT(dir.files, dir.nr, dirstat_compare);
|
|
||||||
gather_dirstat(options, &dir, changed, "", 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void free_diffstat_file(struct diffstat_file *f)
|
static void free_diffstat_file(struct diffstat_file *f)
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
test_description='diff --dirstat tests'
|
test_description='diff --dirstat tests'
|
||||||
|
|
||||||
|
TEST_PASSES_SANITIZE_LEAK=true
|
||||||
. ./test-lib.sh
|
. ./test-lib.sh
|
||||||
|
|
||||||
# set up two commits where the second commit has these files
|
# set up two commits where the second commit has these files
|
||||||
|
|
Загрузка…
Ссылка в новой задаче