>From 711e33993a66941ba7adda24a7ba298bb716e0fa Mon Sep 17 00:00:00 2001 From: =?utf-8?q?P=C3=A1draig=20Brady?= Date: Wed, 10 Nov 2010 14:35:17 +0000 Subject: [PATCH] csplit: fix a memory leak * 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 --- NEWS | 3 +++ src/csplit.c | 8 ++++++++ tests/Makefile.am | 1 + tests/misc/csplit-heap | 29 +++++++++++++++++++++++++++++ 4 files changed, 41 insertions(+), 0 deletions(-) create mode 100755 tests/misc/csplit-heap diff --git a/NEWS b/NEWS index 0cd6153..f859fc7 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,9 @@ GNU coreutils NEWS -*- outline -*- latent bug introduced in coreutils 8.1, and possibly a second latent bug going at least as far back as coreutils 5.97] + csplit no longer leaks memory for every chunk of input processed + [the bug was present in the initial implementation] + tail -F once again notices changes in a currently unavailable remote directory [bug introduced in coreutils-7.5] diff --git a/src/csplit.c b/src/csplit.c index 40baba8..770f891 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, *n; + for (l = buf->line_start; l;) + { + 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; } diff --git a/tests/Makefile.am b/tests/Makefile.am index dd1c509..50a9c42 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -172,6 +172,7 @@ TESTS = \ misc/chroot-fail \ misc/comm \ misc/csplit \ + misc/csplit-heap \ misc/date-sec \ misc/dircolors \ misc/df \ diff --git a/tests/misc/csplit-heap b/tests/misc/csplit-heap new file mode 100755 index 0000000..0e7f8b2 --- /dev/null +++ b/tests/misc/csplit-heap @@ -0,0 +1,29 @@ +#!/bin/sh +# ensure that csplit uses a bounded amount of memory + +# Copyright (C) 2010 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +test "$VERBOSE" = yes && csplit --version + +require_ulimit_ + +( + ulimit -v 20000 + { yes | head -n2500000; echo n; } | csplit -z - %n%1 +) || fail=1 + +Exit $fail -- 1.6.2.5