summaryrefslogtreecommitdiff
path: root/src/csplit.c
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2010-11-10 14:35:17 +0000
committerPádraig Brady <P@draigBrady.com>2010-11-11 01:40:12 +0000
commit0339eb4598600024cedca14a7e882c1737dd2d82 (patch)
treea83d8af40ed3fa2382f8720c0f74aaa8fad644f3 /src/csplit.c
parent7727908335ef1049deac42851026ed8bf5ae2734 (diff)
downloadcoreutils-0339eb4598600024cedca14a7e882c1737dd2d82.tar.xz
csplit: fix a memory leak per input buffer
* src/csplit.c (free_buffer): Also free the line offsets buffers (remove_line): Also free the containing structure * tests/misc/csplit-heap: A new test to trigger with leaks of this magnitude. * tests/Makefile.am: Reference the new test * NEWS: Mention the fix Reported by David Hofstee
Diffstat (limited to 'src/csplit.c')
-rw-r--r--src/csplit.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/csplit.c b/src/csplit.c
index 57543f0a2..948a795e2 100644
--- a/src/csplit.c
+++ b/src/csplit.c
@@ -418,6 +418,13 @@ get_new_buffer (size_t min_size)
static void
free_buffer (struct buffer_record *buf)
{
+ struct line *l;
+ for (l = buf->line_start; l;)
+ {
+ struct line *n = l->next;
+ free (l);
+ l = n;
+ }
free (buf->buffer);
buf->buffer = NULL;
}
@@ -542,6 +549,7 @@ remove_line (void)
if (prev_buf)
{
free_buffer (prev_buf);
+ free (prev_buf);
prev_buf = NULL;
}