* [PATCH 0/6] Memory leaks once again
@ 2015-03-27 22:09 Stefan Beller
2015-03-27 22:09 ` [PATCH 1/6] pack-bitmap: fix a memleak Stefan Beller
` (10 more replies)
0 siblings, 11 replies; 12+ messages in thread
From: Stefan Beller @ 2015-03-27 22:09 UTC (permalink / raw)
To: git, gitster; +Cc: Stefan Beller
Here comes another bunch of memory leaks fixed.
patches 1-4 are safe bets, but 5 and 6 are not so.
In patch 5 I wonder if we need to fix more aggressively and
in patch 6 I just know there is a leak but I have no idea how to
actually fix it.
Stefan Beller (6):
shallow: fix a memleak
line-log.c: fix a memleak
line-log.c: fix a memleak
wt-status.c: fix a memleak
pack-bitmap: fix a memleak
WIP/RFC/entry.c: fix a memleak
entry.c | 4 +++-
line-log.c | 4 ++++
pack-bitmap.c | 27 ++++++++++++++++++---------
shallow.c | 4 ++--
wt-status.c | 2 ++
5 files changed, 29 insertions(+), 12 deletions(-)
--
2.3.0.81.gc37f363
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 1/6] pack-bitmap: fix a memleak
2015-03-27 22:09 [PATCH 0/6] Memory leaks once again Stefan Beller
@ 2015-03-27 22:09 ` Stefan Beller
2015-03-27 22:09 ` [PATCH 1/6] shallow: " Stefan Beller
` (9 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Stefan Beller @ 2015-03-27 22:09 UTC (permalink / raw)
To: git, gitster; +Cc: Stefan Beller
`recent_bitmaps` is allocated in the function load_bitmap_entries_v1
and it is not passed into any function, so it's safe to free it before
leaving that function.
Signed-off-by: Stefan Beller <sbeller@google.com>
---
Notes:
I wonder however if we need to free the actual bitmaps
stored in the recent_bitmaps as well.
pack-bitmap.c | 27 ++++++++++++++++++---------
1 file changed, 18 insertions(+), 9 deletions(-)
diff --git a/pack-bitmap.c b/pack-bitmap.c
index 365f9d9..34823e9 100644
--- a/pack-bitmap.c
+++ b/pack-bitmap.c
@@ -213,7 +213,7 @@ static int load_bitmap_entries_v1(struct bitmap_index *index)
{
static const size_t MAX_XOR_OFFSET = 160;
- uint32_t i;
+ uint32_t i, ret = 0;
struct stored_bitmap **recent_bitmaps;
recent_bitmaps = xcalloc(MAX_XOR_OFFSET, sizeof(struct stored_bitmap));
@@ -232,24 +232,31 @@ static int load_bitmap_entries_v1(struct bitmap_index *index)
sha1 = nth_packed_object_sha1(index->pack, commit_idx_pos);
bitmap = read_bitmap_1(index);
- if (!bitmap)
- return -1;
+ if (!bitmap) {
+ ret = -1;
+ goto out;
+ }
- if (xor_offset > MAX_XOR_OFFSET || xor_offset > i)
- return error("Corrupted bitmap pack index");
+ if (xor_offset > MAX_XOR_OFFSET || xor_offset > i) {
+ ret = error("Corrupted bitmap pack index");
+ goto out;
+ }
if (xor_offset > 0) {
xor_bitmap = recent_bitmaps[(i - xor_offset) % MAX_XOR_OFFSET];
- if (xor_bitmap == NULL)
- return error("Invalid XOR offset in bitmap pack index");
+ if (xor_bitmap == NULL) {
+ ret = error("Invalid XOR offset in bitmap pack index");
+ goto out;
+ }
}
recent_bitmaps[i % MAX_XOR_OFFSET] = store_bitmap(
index, bitmap, sha1, xor_bitmap, flags);
}
-
- return 0;
+out:
+ free(recent_bitmaps);
+ return ret;
}
static char *pack_bitmap_filename(struct packed_git *p)
@@ -986,6 +993,8 @@ void test_bitmap_walk(struct rev_info *revs)
fprintf(stderr, "OK!\n");
else
fprintf(stderr, "Mismatch!\n");
+
+ free(result);
}
static int rebuild_bitmap(uint32_t *reposition,
--
2.3.0.81.gc37f363
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 1/6] shallow: fix a memleak
2015-03-27 22:09 [PATCH 0/6] Memory leaks once again Stefan Beller
2015-03-27 22:09 ` [PATCH 1/6] pack-bitmap: fix a memleak Stefan Beller
@ 2015-03-27 22:09 ` Stefan Beller
2015-03-27 22:09 ` [PATCH 2/6] line-log.c: " Stefan Beller
` (8 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Stefan Beller @ 2015-03-27 22:09 UTC (permalink / raw)
To: git, gitster; +Cc: Stefan Beller
Signed-off-by: Stefan Beller <sbeller@google.com>
---
shallow.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/shallow.c b/shallow.c
index d8bf40a..f8b0458 100644
--- a/shallow.c
+++ b/shallow.c
@@ -416,7 +416,7 @@ static void paint_down(struct paint_info *info, const unsigned char *sha1,
uint32_t *bitmap = paint_alloc(info);
struct commit *c = lookup_commit_reference_gently(sha1, 1);
if (!c)
- return;
+ goto out;
memset(bitmap, 0, bitmap_size);
bitmap[id / 32] |= (1 << (id % 32));
commit_list_insert(c, &head);
@@ -471,7 +471,7 @@ static void paint_down(struct paint_info *info, const unsigned char *sha1,
if (o && o->type == OBJ_COMMIT)
o->flags &= ~SEEN;
}
-
+out:
free(tmp);
}
--
2.3.0.81.gc37f363
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 2/6] line-log.c: fix a memleak
2015-03-27 22:09 [PATCH 0/6] Memory leaks once again Stefan Beller
2015-03-27 22:09 ` [PATCH 1/6] pack-bitmap: fix a memleak Stefan Beller
2015-03-27 22:09 ` [PATCH 1/6] shallow: " Stefan Beller
@ 2015-03-27 22:09 ` Stefan Beller
2015-03-27 22:09 ` [PATCH 2/6] shallow: " Stefan Beller
` (7 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Stefan Beller @ 2015-03-27 22:09 UTC (permalink / raw)
To: git, gitster; +Cc: Stefan Beller
The `filepair` is assigned new memory with any iteration via
process_diff_filepair, so free it before the current iteration ends.
Signed-off-by: Stefan Beller <sbeller@google.com>
---
line-log.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/line-log.c b/line-log.c
index a490efe..b43ac58 100644
--- a/line-log.c
+++ b/line-log.c
@@ -1099,6 +1099,7 @@ static int process_all_files(struct line_log_data **range_out,
rg->pair = diff_filepair_dup(queue->queue[i]);
memcpy(&rg->diff, pairdiff, sizeof(struct diff_ranges));
}
+ free(pairdiff);
}
return changed;
--
2.3.0.81.gc37f363
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 2/6] shallow: fix a memleak
2015-03-27 22:09 [PATCH 0/6] Memory leaks once again Stefan Beller
` (2 preceding siblings ...)
2015-03-27 22:09 ` [PATCH 2/6] line-log.c: " Stefan Beller
@ 2015-03-27 22:09 ` Stefan Beller
2015-03-27 22:09 ` [PATCH 3/6] line-log.c: " Stefan Beller
` (6 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Stefan Beller @ 2015-03-27 22:09 UTC (permalink / raw)
To: git, gitster; +Cc: Stefan Beller
Signed-off-by: Stefan Beller <sbeller@google.com>
---
shallow.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/shallow.c b/shallow.c
index d8bf40a..f8b0458 100644
--- a/shallow.c
+++ b/shallow.c
@@ -416,7 +416,7 @@ static void paint_down(struct paint_info *info, const unsigned char *sha1,
uint32_t *bitmap = paint_alloc(info);
struct commit *c = lookup_commit_reference_gently(sha1, 1);
if (!c)
- return;
+ goto out;
memset(bitmap, 0, bitmap_size);
bitmap[id / 32] |= (1 << (id % 32));
commit_list_insert(c, &head);
@@ -471,7 +471,7 @@ static void paint_down(struct paint_info *info, const unsigned char *sha1,
if (o && o->type == OBJ_COMMIT)
o->flags &= ~SEEN;
}
-
+out:
free(tmp);
}
--
2.3.0.81.gc37f363
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 3/6] line-log.c: fix a memleak
2015-03-27 22:09 [PATCH 0/6] Memory leaks once again Stefan Beller
` (3 preceding siblings ...)
2015-03-27 22:09 ` [PATCH 2/6] shallow: " Stefan Beller
@ 2015-03-27 22:09 ` Stefan Beller
2015-03-27 22:09 ` [PATCH 4/6] " Stefan Beller
` (5 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Stefan Beller @ 2015-03-27 22:09 UTC (permalink / raw)
To: git, gitster; +Cc: Stefan Beller
Signed-off-by: Stefan Beller <sbeller@google.com>
---
line-log.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/line-log.c b/line-log.c
index b43ac58..db6e58d 100644
--- a/line-log.c
+++ b/line-log.c
@@ -1129,6 +1129,9 @@ static int process_ranges_ordinary_commit(struct rev_info *rev, struct commit *c
changed = process_all_files(&parent_range, rev, &queue, range);
if (parent)
add_line_range(rev, parent, parent_range);
+ else
+ free_line_log_data(parent_range);
+
return changed;
}
--
2.3.0.81.gc37f363
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 4/6] line-log.c: fix a memleak
2015-03-27 22:09 [PATCH 0/6] Memory leaks once again Stefan Beller
` (4 preceding siblings ...)
2015-03-27 22:09 ` [PATCH 3/6] line-log.c: " Stefan Beller
@ 2015-03-27 22:09 ` Stefan Beller
2015-03-27 22:09 ` [PATCH 4/6] wt-status.c: " Stefan Beller
` (4 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Stefan Beller @ 2015-03-27 22:09 UTC (permalink / raw)
To: git, gitster; +Cc: Stefan Beller
Signed-off-by: Stefan Beller <sbeller@google.com>
---
line-log.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/line-log.c b/line-log.c
index b43ac58..db6e58d 100644
--- a/line-log.c
+++ b/line-log.c
@@ -1129,6 +1129,9 @@ static int process_ranges_ordinary_commit(struct rev_info *rev, struct commit *c
changed = process_all_files(&parent_range, rev, &queue, range);
if (parent)
add_line_range(rev, parent, parent_range);
+ else
+ free_line_log_data(parent_range);
+
return changed;
}
--
2.3.0.81.gc37f363
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 4/6] wt-status.c: fix a memleak
2015-03-27 22:09 [PATCH 0/6] Memory leaks once again Stefan Beller
` (5 preceding siblings ...)
2015-03-27 22:09 ` [PATCH 4/6] " Stefan Beller
@ 2015-03-27 22:09 ` Stefan Beller
2015-03-27 22:09 ` [PATCH 5/6] pack-bitmap: " Stefan Beller
` (3 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Stefan Beller @ 2015-03-27 22:09 UTC (permalink / raw)
To: git, gitster; +Cc: Stefan Beller
In any code path of shorten_unambiguous_ref the return value is a
xstrdup(some string), so it is safe to free the variable `base`
in any codepath.
Signed-off-by: Stefan Beller <sbeller@google.com>
---
wt-status.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/wt-status.c b/wt-status.c
index 853419f..9d2a349 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -1576,6 +1576,8 @@ static void wt_shortstatus_print_tracking(struct wt_status *s)
color_fprintf(s->fp, header_color, "]");
fputc(s->null_termination ? '\0' : '\n', s->fp);
+
+ free((char *)base);
}
void wt_shortstatus_print(struct wt_status *s)
--
2.3.0.81.gc37f363
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 5/6] pack-bitmap: fix a memleak
2015-03-27 22:09 [PATCH 0/6] Memory leaks once again Stefan Beller
` (6 preceding siblings ...)
2015-03-27 22:09 ` [PATCH 4/6] wt-status.c: " Stefan Beller
@ 2015-03-27 22:09 ` Stefan Beller
2015-03-27 22:09 ` [PATCH 5/6] wt-status.c: " Stefan Beller
` (2 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Stefan Beller @ 2015-03-27 22:09 UTC (permalink / raw)
To: git, gitster; +Cc: Stefan Beller
`recent_bitmaps` is allocated in the function load_bitmap_entries_v1
and it is not passed into any function, so it's safe to free it before
leaving that function.
Signed-off-by: Stefan Beller <sbeller@google.com>
---
Notes:
I wonder however if we need to free the actual bitmaps
stored in the recent_bitmaps as well.
pack-bitmap.c | 27 ++++++++++++++++++---------
1 file changed, 18 insertions(+), 9 deletions(-)
diff --git a/pack-bitmap.c b/pack-bitmap.c
index 365f9d9..34823e9 100644
--- a/pack-bitmap.c
+++ b/pack-bitmap.c
@@ -213,7 +213,7 @@ static int load_bitmap_entries_v1(struct bitmap_index *index)
{
static const size_t MAX_XOR_OFFSET = 160;
- uint32_t i;
+ uint32_t i, ret = 0;
struct stored_bitmap **recent_bitmaps;
recent_bitmaps = xcalloc(MAX_XOR_OFFSET, sizeof(struct stored_bitmap));
@@ -232,24 +232,31 @@ static int load_bitmap_entries_v1(struct bitmap_index *index)
sha1 = nth_packed_object_sha1(index->pack, commit_idx_pos);
bitmap = read_bitmap_1(index);
- if (!bitmap)
- return -1;
+ if (!bitmap) {
+ ret = -1;
+ goto out;
+ }
- if (xor_offset > MAX_XOR_OFFSET || xor_offset > i)
- return error("Corrupted bitmap pack index");
+ if (xor_offset > MAX_XOR_OFFSET || xor_offset > i) {
+ ret = error("Corrupted bitmap pack index");
+ goto out;
+ }
if (xor_offset > 0) {
xor_bitmap = recent_bitmaps[(i - xor_offset) % MAX_XOR_OFFSET];
- if (xor_bitmap == NULL)
- return error("Invalid XOR offset in bitmap pack index");
+ if (xor_bitmap == NULL) {
+ ret = error("Invalid XOR offset in bitmap pack index");
+ goto out;
+ }
}
recent_bitmaps[i % MAX_XOR_OFFSET] = store_bitmap(
index, bitmap, sha1, xor_bitmap, flags);
}
-
- return 0;
+out:
+ free(recent_bitmaps);
+ return ret;
}
static char *pack_bitmap_filename(struct packed_git *p)
@@ -986,6 +993,8 @@ void test_bitmap_walk(struct rev_info *revs)
fprintf(stderr, "OK!\n");
else
fprintf(stderr, "Mismatch!\n");
+
+ free(result);
}
static int rebuild_bitmap(uint32_t *reposition,
--
2.3.0.81.gc37f363
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 5/6] wt-status.c: fix a memleak
2015-03-27 22:09 [PATCH 0/6] Memory leaks once again Stefan Beller
` (7 preceding siblings ...)
2015-03-27 22:09 ` [PATCH 5/6] pack-bitmap: " Stefan Beller
@ 2015-03-27 22:09 ` Stefan Beller
2015-03-27 22:09 ` [PATCH 6/6] WIP/RFC/entry.c: " Stefan Beller
2015-03-27 22:12 ` [PATCH 0/6] Memory leaks once again Stefan Beller
10 siblings, 0 replies; 12+ messages in thread
From: Stefan Beller @ 2015-03-27 22:09 UTC (permalink / raw)
To: git, gitster; +Cc: Stefan Beller
In any code path of shorten_unambiguous_ref the return value is a
xstrdup(some string), so it is safe to free the variable `base`
in any codepath.
Signed-off-by: Stefan Beller <sbeller@google.com>
---
wt-status.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/wt-status.c b/wt-status.c
index 853419f..9d2a349 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -1576,6 +1576,8 @@ static void wt_shortstatus_print_tracking(struct wt_status *s)
color_fprintf(s->fp, header_color, "]");
fputc(s->null_termination ? '\0' : '\n', s->fp);
+
+ free((char *)base);
}
void wt_shortstatus_print(struct wt_status *s)
--
2.3.0.81.gc37f363
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 6/6] WIP/RFC/entry.c: fix a memleak
2015-03-27 22:09 [PATCH 0/6] Memory leaks once again Stefan Beller
` (8 preceding siblings ...)
2015-03-27 22:09 ` [PATCH 5/6] wt-status.c: " Stefan Beller
@ 2015-03-27 22:09 ` Stefan Beller
2015-03-27 22:12 ` [PATCH 0/6] Memory leaks once again Stefan Beller
10 siblings, 0 replies; 12+ messages in thread
From: Stefan Beller @ 2015-03-27 22:09 UTC (permalink / raw)
To: git, gitster; +Cc: Stefan Beller
I observe that filter is going out of scope, but the
implementation proposed in this patch produces just a
crash instead of any helpful fix.
Signed-off-by: Stefan Beller <sbeller@google.com>
---
entry.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/entry.c b/entry.c
index 1eda8e9..5383001 100644
--- a/entry.c
+++ b/entry.c
@@ -152,8 +152,10 @@ static int write_entry(struct cache_entry *ce,
if (filter &&
!streaming_write_entry(ce, path, filter,
state, to_tempfile,
- &fstat_done, &st))
+ &fstat_done, &st)) {
+ free_stream_filter(filter);
goto finish;
+ }
}
switch (ce_mode_s_ifmt) {
--
2.3.0.81.gc37f363
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 0/6] Memory leaks once again
2015-03-27 22:09 [PATCH 0/6] Memory leaks once again Stefan Beller
` (9 preceding siblings ...)
2015-03-27 22:09 ` [PATCH 6/6] WIP/RFC/entry.c: " Stefan Beller
@ 2015-03-27 22:12 ` Stefan Beller
10 siblings, 0 replies; 12+ messages in thread
From: Stefan Beller @ 2015-03-27 22:12 UTC (permalink / raw)
To: git@vger.kernel.org, Junio C Hamano; +Cc: Stefan Beller
On Fri, Mar 27, 2015 at 3:09 PM, Stefan Beller <sbeller@google.com> wrote:
> Here comes another bunch of memory leaks fixed.
> patches 1-4 are safe bets, but 5 and 6 are not so.
>
> In patch 5 I wonder if we need to fix more aggressively and
> in patch 6 I just know there is a leak but I have no idea how to
> actually fix it.
>
And I sent 12 instead of 6 patches because I needed to fine tune the
order of the patch set and I forgot to delete the un-tuned version.
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2015-03-27 22:12 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-03-27 22:09 [PATCH 0/6] Memory leaks once again Stefan Beller
2015-03-27 22:09 ` [PATCH 1/6] pack-bitmap: fix a memleak Stefan Beller
2015-03-27 22:09 ` [PATCH 1/6] shallow: " Stefan Beller
2015-03-27 22:09 ` [PATCH 2/6] line-log.c: " Stefan Beller
2015-03-27 22:09 ` [PATCH 2/6] shallow: " Stefan Beller
2015-03-27 22:09 ` [PATCH 3/6] line-log.c: " Stefan Beller
2015-03-27 22:09 ` [PATCH 4/6] " Stefan Beller
2015-03-27 22:09 ` [PATCH 4/6] wt-status.c: " Stefan Beller
2015-03-27 22:09 ` [PATCH 5/6] pack-bitmap: " Stefan Beller
2015-03-27 22:09 ` [PATCH 5/6] wt-status.c: " Stefan Beller
2015-03-27 22:09 ` [PATCH 6/6] WIP/RFC/entry.c: " Stefan Beller
2015-03-27 22:12 ` [PATCH 0/6] Memory leaks once again Stefan Beller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).