]> granicus.if.org Git - vim/commitdiff
patch 8.0.1083: leaking memory in input part of channel v8.0.1083
authorBram Moolenaar <Bram@vim.org>
Sat, 9 Sep 2017 16:16:43 +0000 (18:16 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 9 Sep 2017 16:16:43 +0000 (18:16 +0200)
Problem:    Leaking memory in input part of channel.
Solution:   Clear the input part of channel.  Free the entry. Move failing
            command test to a separate file to avoid bogus leak reports
            clouding tests that should not leak.

src/Makefile
src/channel.c
src/testdir/Make_all.mak
src/testdir/test_terminal.vim
src/testdir/test_terminal_fail.vim [new file with mode: 0644]
src/version.c

index 27615fa9260ecf0a0f6a9a91a89228d5a134b874..0cb00589f4c0c219e94bdc6153728d507958449e 100644 (file)
@@ -2265,6 +2265,7 @@ test_arglist \
        test_taglist \
        test_tcl \
        test_terminal \
+       test_terminal_fail \
        test_textobjects \
        test_timers \
        test_true_false \
index 0e9a58007e37dafc57cde77fe268d2a3ed46dc23..fa1898db9c6da4a990a2944708aec6feca8df36c 100644 (file)
@@ -2939,6 +2939,7 @@ remove_from_writeque(writeq_T *wq, writeq_T *entry)
        wq->wq_prev = NULL;
     else
        wq->wq_next->wq_prev = NULL;
+    vim_free(entry);
 }
 
 /*
@@ -2990,7 +2991,7 @@ channel_clear(channel_T *channel)
     channel_clear_one(channel, PART_SOCK);
     channel_clear_one(channel, PART_OUT);
     channel_clear_one(channel, PART_ERR);
-    /* there is no callback or queue for PART_IN */
+    channel_clear_one(channel, PART_IN);
     free_callback(channel->ch_callback, channel->ch_partial);
     channel->ch_callback = NULL;
     channel->ch_partial = NULL;
index ad95b1b6e1582e3d6e9f4547693c5ce5b384aa0a..b979c975b7895bd1c4444720ed89b4e9200dff47 100644 (file)
@@ -194,6 +194,7 @@ NEW_TESTS = test_arabic.res \
            test_system.res \
            test_tcl.res \
            test_terminal.res \
+           test_terminal_fail.res \
            test_textobjects.res \
            test_undo.res \
            test_usercommands.res \
index 004c2c37fea5d162b92eac98a2cff4f1eb417603..738c3d4de83d0f0b10d83edf8b337bc4f518891b 100644 (file)
@@ -608,14 +608,6 @@ func Test_terminal_redir_file()
   endif
 
   if has('unix')
-    let buf = term_start('xyzabc', {'err_io': 'file', 'err_name': 'Xfile'})
-    call term_wait(buf)
-    call WaitFor('len(readfile("Xfile")) > 0')
-    call assert_match('executing job failed', readfile('Xfile')[0])
-    call WaitFor('!&modified')
-    call delete('Xfile')
-    bwipe
-
     call writefile(['one line'], 'Xfile')
     let buf = term_start('cat', {'in_io': 'file', 'in_name': 'Xfile'})
     call term_wait(buf)
diff --git a/src/testdir/test_terminal_fail.vim b/src/testdir/test_terminal_fail.vim
new file mode 100644 (file)
index 0000000..aad4b98
--- /dev/null
@@ -0,0 +1,21 @@
+" This test is in a separate file, because it usually causes reports for memory
+" leaks under valgrind.  That is because when fork/exec fails memory is not
+" freed.  Since the process exists right away it's not a real leak.
+
+if !has('terminal')
+  finish
+endif
+
+source shared.vim
+
+func Test_terminal_redir_fails()
+  if has('unix')
+    let buf = term_start('xyzabc', {'err_io': 'file', 'err_name': 'Xfile'})
+    call term_wait(buf)
+    call WaitFor('len(readfile("Xfile")) > 0')
+    call assert_match('executing job failed', readfile('Xfile')[0])
+    call WaitFor('!&modified')
+    call delete('Xfile')
+    bwipe
+  endif
+endfunc
index f2fde0055a1f929d59d37877e227a6342ef8aaad..8c610b71e07e38b246e79fa013cd406aaca3aacc 100644 (file)
@@ -769,6 +769,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1083,
 /**/
     1082,
 /**/