From 1943aec2ec390d9fda159aa0412362780ec83f09 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Thu, 9 Apr 2009 14:15:57 +0000 Subject: [PATCH] hush: plug the leak of expanded heredoc --- shell/hush.c | 15 +++++--- .../hush_test/hush-z_slow/leak_heredoc1.right | 3 ++ .../hush_test/hush-z_slow/leak_heredoc1.tests | 34 +++++++++++++++++++ shell/match.c | 3 +- shell/math.c | 3 +- shell/msh.c | 1 - 6 files changed, 49 insertions(+), 10 deletions(-) create mode 100644 shell/hush_test/hush-z_slow/leak_heredoc1.right create mode 100755 shell/hush_test/hush-z_slow/leak_heredoc1.tests diff --git a/shell/hush.c b/shell/hush.c index d791b62d0..4c2716ddd 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -64,7 +64,6 @@ * * Licensed under the GPL v2 or later, see the file LICENSE in this tarball. */ - #include "busybox.h" /* for APPLET_IS_NOFORK/NOEXEC */ //TODO: pull in some .h and find out whether we have SINGLE_APPLET_MAIN? //#include "applet_tables.h" doesn't work @@ -79,6 +78,12 @@ # define PIPE_BUF 4096 /* amount of buffering in a pipe */ #endif + +/* Debug build knobs */ +//#define LEAK_HUNTING 1 +//#define WANT_TO_TEST_NOMMU 1 + + #ifdef WANT_TO_TEST_NOMMU # undef BB_MMU # undef USE_FOR_NOMMU @@ -214,8 +219,7 @@ static void debug_print_strings(const char *prefix, char **vv) /* * Leak hunting. Use hush_leaktool.sh for post-processing. */ -//#define FOR_HUSH_LEAKTOOL -#ifdef FOR_HUSH_LEAKTOOL +#ifdef LEAK_HUNTING static void *xxmalloc(int lineno, size_t size) { void *ptr = xmalloc((size + 0xff) & ~0xff); @@ -743,7 +747,7 @@ static char **add_strings_to_strings(char **strings, char **add, int need_to_dup v[count1 + i] = (need_to_dup ? xstrdup(add[i]) : add[i]); return v; } -#ifdef FOR_HUSH_LEAKTOOL +#ifdef LEAK_HUNTING static char **xx_add_strings_to_strings(int lineno, char **strings, char **add, int need_to_dup) { char **ptr = add_strings_to_strings(strings, add, need_to_dup); @@ -761,7 +765,7 @@ static char **add_string_to_strings(char **strings, char *add) v[1] = NULL; return add_strings_to_strings(strings, v, /*dup:*/ 0); } -#ifdef FOR_HUSH_LEAKTOOL +#ifdef LEAK_HUNTING static char **xx_add_string_to_strings(int lineno, char **strings, char *add) { char **ptr = add_string_to_strings(strings, add); @@ -2310,6 +2314,7 @@ static void setup_heredoc(struct redir_struct *redir) len -= written; if (len == 0) { close(pair.wr); + free(expanded); return; } heredoc += written; diff --git a/shell/hush_test/hush-z_slow/leak_heredoc1.right b/shell/hush_test/hush-z_slow/leak_heredoc1.right new file mode 100644 index 000000000..c6f0334f3 --- /dev/null +++ b/shell/hush_test/hush-z_slow/leak_heredoc1.right @@ -0,0 +1,3 @@ +Warm up +Measuring memory leak... +Ok diff --git a/shell/hush_test/hush-z_slow/leak_heredoc1.tests b/shell/hush_test/hush-z_slow/leak_heredoc1.tests new file mode 100755 index 000000000..26cbb28a4 --- /dev/null +++ b/shell/hush_test/hush-z_slow/leak_heredoc1.tests @@ -0,0 +1,34 @@ +echo "Warm up" +i=1 +while test $i != 99; do + : < # include @@ -22,7 +21,7 @@ # include # include #else -# include "busybox.h" +# include "libbb.h" #endif #include #include "match.h" diff --git a/shell/math.c b/shell/math.c index 8a44c8e88..cc298bd24 100644 --- a/shell/math.c +++ b/shell/math.c @@ -26,8 +26,7 @@ * rewrote arith (see notes to this), added locale support, * rewrote dynamic variables. */ - -#include "busybox.h" +#include "libbb.h" #include "math.h" #define a_e_h_t arith_eval_hooks_t diff --git a/shell/msh.c b/shell/msh.c index da1dc3576..dffacf02a 100644 --- a/shell/msh.c +++ b/shell/msh.c @@ -12,7 +12,6 @@ * * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. */ - #include #include -- 2.25.1