summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-09-09 18:16:43 +0200
committerBram Moolenaar <Bram@vim.org>2017-09-09 18:16:43 +0200
commit5b5adf5b9cd226d775643872e65c62674d6ada95 (patch)
tree4b06972c0929cd46fd955b5a25e872727ffe450d /src
parent9d18961323a2a5c3b609c98ce0d78613c71f3532 (diff)
downloadvim-5b5adf5b9cd226d775643872e65c62674d6ada95.zip
patch 8.0.1083: leaking memory in input part of channel
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.
Diffstat (limited to 'src')
-rw-r--r--src/Makefile1
-rw-r--r--src/channel.c3
-rw-r--r--src/testdir/Make_all.mak1
-rw-r--r--src/testdir/test_terminal.vim8
-rw-r--r--src/testdir/test_terminal_fail.vim21
-rw-r--r--src/version.c2
6 files changed, 27 insertions, 9 deletions
diff --git a/src/Makefile b/src/Makefile
index 27615fa92..0cb00589f 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -2265,6 +2265,7 @@ test_arglist \
test_taglist \
test_tcl \
test_terminal \
+ test_terminal_fail \
test_textobjects \
test_timers \
test_true_false \
diff --git a/src/channel.c b/src/channel.c
index 0e9a58007..fa1898db9 100644
--- a/src/channel.c
+++ b/src/channel.c
@@ -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;
diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak
index ad95b1b6e..b979c975b 100644
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -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 \
diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim
index 004c2c37f..738c3d4de 100644
--- a/src/testdir/test_terminal.vim
+++ b/src/testdir/test_terminal.vim
@@ -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
index 000000000..aad4b98cb
--- /dev/null
+++ b/src/testdir/test_terminal_fail.vim
@@ -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
diff --git a/src/version.c b/src/version.c
index f2fde0055..8c610b71e 100644
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1083,
+/**/
1082,
/**/
1081,