зеркало из https://github.com/microsoft/git.git
Merge branch 'sg/plug-line-log-leaks'
A handful of leaks in the line-log machinery have been plugged. * sg/plug-line-log-leaks: diff.c: use diff_free_queue() line-log: free the diff queues' arrays when processing merge commits line-log: free diff queue when processing non-merge commits
This commit is contained in:
Коммит
613999cc5c
17
diff.c
17
diff.c
|
@ -5772,6 +5772,13 @@ void diff_free_filepair(struct diff_filepair *p)
|
||||||
free(p);
|
free(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void diff_free_queue(struct diff_queue_struct *q)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < q->nr; i++)
|
||||||
|
diff_free_filepair(q->queue[i]);
|
||||||
|
free(q->queue);
|
||||||
|
}
|
||||||
|
|
||||||
const char *diff_aligned_abbrev(const struct object_id *oid, int len)
|
const char *diff_aligned_abbrev(const struct object_id *oid, int len)
|
||||||
{
|
{
|
||||||
int abblen;
|
int abblen;
|
||||||
|
@ -6329,13 +6336,9 @@ static int diff_get_patch_id(struct diff_options *options, struct object_id *oid
|
||||||
int diff_flush_patch_id(struct diff_options *options, struct object_id *oid, int diff_header_only)
|
int diff_flush_patch_id(struct diff_options *options, struct object_id *oid, int diff_header_only)
|
||||||
{
|
{
|
||||||
struct diff_queue_struct *q = &diff_queued_diff;
|
struct diff_queue_struct *q = &diff_queued_diff;
|
||||||
int i;
|
|
||||||
int result = diff_get_patch_id(options, oid, diff_header_only);
|
int result = diff_get_patch_id(options, oid, diff_header_only);
|
||||||
|
|
||||||
for (i = 0; i < q->nr; i++)
|
diff_free_queue(q);
|
||||||
diff_free_filepair(q->queue[i]);
|
|
||||||
|
|
||||||
free(q->queue);
|
|
||||||
DIFF_QUEUE_CLEAR(q);
|
DIFF_QUEUE_CLEAR(q);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -6604,10 +6607,8 @@ void diff_flush(struct diff_options *options)
|
||||||
if (output_format & DIFF_FORMAT_CALLBACK)
|
if (output_format & DIFF_FORMAT_CALLBACK)
|
||||||
options->format_callback(q, options, options->format_callback_data);
|
options->format_callback(q, options, options->format_callback_data);
|
||||||
|
|
||||||
for (i = 0; i < q->nr; i++)
|
|
||||||
diff_free_filepair(q->queue[i]);
|
|
||||||
free_queue:
|
free_queue:
|
||||||
free(q->queue);
|
diff_free_queue(q);
|
||||||
DIFF_QUEUE_CLEAR(q);
|
DIFF_QUEUE_CLEAR(q);
|
||||||
diff_free(options);
|
diff_free(options);
|
||||||
|
|
||||||
|
|
|
@ -162,6 +162,7 @@ struct diff_filepair *diff_queue(struct diff_queue_struct *,
|
||||||
struct diff_filespec *,
|
struct diff_filespec *,
|
||||||
struct diff_filespec *);
|
struct diff_filespec *);
|
||||||
void diff_q(struct diff_queue_struct *, struct diff_filepair *);
|
void diff_q(struct diff_queue_struct *, struct diff_filepair *);
|
||||||
|
void diff_free_queue(struct diff_queue_struct *q);
|
||||||
|
|
||||||
/* dir_rename_relevance: the reason we want rename information for a dir */
|
/* dir_rename_relevance: the reason we want rename information for a dir */
|
||||||
enum dir_rename_relevance {
|
enum dir_rename_relevance {
|
||||||
|
|
|
@ -1089,10 +1089,8 @@ static struct diff_filepair *diff_filepair_dup(struct diff_filepair *pair)
|
||||||
|
|
||||||
static void free_diffqueues(int n, struct diff_queue_struct *dq)
|
static void free_diffqueues(int n, struct diff_queue_struct *dq)
|
||||||
{
|
{
|
||||||
int i, j;
|
for (int i = 0; i < n; i++)
|
||||||
for (i = 0; i < n; i++)
|
diff_free_queue(&dq[i]);
|
||||||
for (j = 0; j < dq[i].nr; j++)
|
|
||||||
diff_free_filepair(dq[i].queue[j]);
|
|
||||||
free(dq);
|
free(dq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1195,6 +1193,7 @@ static int process_ranges_ordinary_commit(struct rev_info *rev, struct commit *c
|
||||||
if (parent)
|
if (parent)
|
||||||
add_line_range(rev, parent, parent_range);
|
add_line_range(rev, parent, parent_range);
|
||||||
free_line_log_data(parent_range);
|
free_line_log_data(parent_range);
|
||||||
|
diff_free_queue(&queue);
|
||||||
return changed;
|
return changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче