hush: plug the leak of expanded heredoc
authorDenis Vlasenko <vda.linux@googlemail.com>
Thu, 9 Apr 2009 14:15:57 +0000 (14:15 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Thu, 9 Apr 2009 14:15:57 +0000 (14:15 -0000)
shell/hush.c
shell/hush_test/hush-z_slow/leak_heredoc1.right [new file with mode: 0644]
shell/hush_test/hush-z_slow/leak_heredoc1.tests [new file with mode: 0755]
shell/match.c
shell/math.c
shell/msh.c

index d791b62d082965538b1000bcbe4da4544e2b4104..4c2716ddd0e007af2ec28cd323b80632f08d77cd 100644 (file)
@@ -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
 # 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 (file)
index 0000000..c6f0334
--- /dev/null
@@ -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 (executable)
index 0000000..26cbb28
--- /dev/null
@@ -0,0 +1,34 @@
+echo "Warm up"
+i=1
+while test $i != 99; do
+    : <<HERE
+Hello $i `echo builtin_$i`
+HERE
+    : $((i++))
+done
+
+memleak
+
+echo "Measuring memory leak..."
+i=1
+while test $i != 99; do
+    : <<HERE
+Hello $i `echo builtin_$i`
+HERE
+    : $((i++))
+done
+i=1
+while test $i != 99; do
+    : <<HERE
+Hello $i `echo builtin_$i`
+HERE
+    : $((i++))
+done
+
+memleak
+kb=$?
+if test $kb -le 4; then
+    echo Ok #$kb
+else
+    echo "Bad: $kb kb (or more) leaked"
+fi
index 0810fd8f664c2b0d43c5d9ecd3de9ac0cbdd2724..47038d667132622f7bbc4b91cdcbc4fb1a768f73 100644 (file)
@@ -14,7 +14,6 @@
  *
  * Original BSD copyright notice is retained at the end of this file.
  */
-
 #ifdef STANDALONE
 # include <stdbool.h>
 # include <stdio.h>
@@ -22,7 +21,7 @@
 # include <string.h>
 # include <unistd.h>
 #else
-# include "busybox.h"
+# include "libbb.h"
 #endif
 #include <fnmatch.h>
 #include "match.h"
index 8a44c8e88dd7d07ff7a862d8c74d922d3a1a5ebb..cc298bd24a2f109b3f6cee73ab7ad299791f1dff 100644 (file)
@@ -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
index da1dc35768633315a45cad686a5c6d847ff45ebc..dffacf02adac12befb6f19d093b60b185f532ce5 100644 (file)
@@ -12,7 +12,6 @@
  *
  * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  */
-
 #include <sys/times.h>
 #include <setjmp.h>