diff options
author | Pádraig Brady <P@draigBrady.com> | 2010-11-10 14:35:17 +0000 |
---|---|---|
committer | Pádraig Brady <P@draigBrady.com> | 2010-11-11 01:40:12 +0000 |
commit | 0339eb4598600024cedca14a7e882c1737dd2d82 (patch) | |
tree | a83d8af40ed3fa2382f8720c0f74aaa8fad644f3 /src | |
parent | 7727908335ef1049deac42851026ed8bf5ae2734 (diff) | |
download | coreutils-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')
-rw-r--r-- | src/csplit.c | 8 |
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; } |