mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
Merge pull request #4760 from justinmk/term-use-after-free
term_close use-after-free
This commit is contained in:
commit
082abb7ca6
@ -21701,6 +21701,18 @@ static void term_resize(uint16_t width, uint16_t height, void *d)
|
|||||||
pty_process_resize(&data->proc.pty, width, height);
|
pty_process_resize(&data->proc.pty, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void term_delayed_free(void **argv)
|
||||||
|
{
|
||||||
|
TerminalJobData *j = argv[0];
|
||||||
|
if (j->in.pending_reqs || j->out.pending_reqs || j->err.pending_reqs) {
|
||||||
|
queue_put(j->events, term_delayed_free, 1, j);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
terminal_destroy(j->term);
|
||||||
|
term_job_data_decref(j);
|
||||||
|
}
|
||||||
|
|
||||||
static void term_close(void *d)
|
static void term_close(void *d)
|
||||||
{
|
{
|
||||||
TerminalJobData *data = d;
|
TerminalJobData *data = d;
|
||||||
@ -21708,8 +21720,7 @@ static void term_close(void *d)
|
|||||||
data->exited = true;
|
data->exited = true;
|
||||||
process_stop((Process *)&data->proc);
|
process_stop((Process *)&data->proc);
|
||||||
}
|
}
|
||||||
terminal_destroy(data->term);
|
queue_put(data->events, term_delayed_free, 1, data);
|
||||||
term_job_data_decref(d);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void term_job_data_decref(TerminalJobData *data)
|
static void term_job_data_decref(TerminalJobData *data)
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
-- Test for text formatting.
|
|
||||||
|
|
||||||
local helpers = require('test.functional.helpers')
|
local helpers = require('test.functional.helpers')
|
||||||
local feed, insert, source = helpers.feed, helpers.insert, helpers.source
|
local feed, insert = helpers.feed, helpers.insert
|
||||||
local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
|
local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
|
||||||
|
|
||||||
describe('text formatting', function()
|
describe('text formatting', function()
|
||||||
|
@ -158,8 +158,7 @@ describe('terminal buffer', function()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
it('handles loss of focus gracefully', function()
|
it('handles loss of focus gracefully', function()
|
||||||
-- Temporarily change the statusline to avoid printing the file name, which
|
-- Change the statusline to avoid printing the file name, which varies.
|
||||||
-- varies be where the test is run.
|
|
||||||
nvim('set_option', 'statusline', '==========')
|
nvim('set_option', 'statusline', '==========')
|
||||||
execute('set laststatus=0')
|
execute('set laststatus=0')
|
||||||
|
|
||||||
@ -195,5 +194,15 @@ describe('terminal buffer', function()
|
|||||||
|
|
||||||
execute('set laststatus=1') -- Restore laststatus to the default.
|
execute('set laststatus=1') -- Restore laststatus to the default.
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('term_close() use-after-free #4393', function()
|
||||||
|
if eval("executable('yes')") == 0 then
|
||||||
|
pending('missing "yes" command')
|
||||||
|
return
|
||||||
|
end
|
||||||
|
execute('terminal yes')
|
||||||
|
feed([[<C-\><C-n>]])
|
||||||
|
execute('bdelete!')
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
local helpers = require('test.functional.helpers')
|
local helpers = require('test.functional.helpers')
|
||||||
local Screen = require('test.functional.ui.screen')
|
local Screen = require('test.functional.ui.screen')
|
||||||
local clear, wait, nvim = helpers.clear, helpers.wait, helpers.nvim
|
local clear, wait, nvim = helpers.clear, helpers.wait, helpers.nvim
|
||||||
local nvim_dir, source, ok = helpers.nvim_dir, helpers.source, helpers.ok
|
local nvim_dir, source, eq = helpers.nvim_dir, helpers.source, helpers.eq
|
||||||
local execute, eval = helpers.execute, helpers.eval
|
local execute, eval = helpers.execute, helpers.eval
|
||||||
|
|
||||||
describe(':terminal', function()
|
describe(':terminal', function()
|
||||||
@ -53,7 +53,7 @@ describe(':terminal', function()
|
|||||||
source([[
|
source([[
|
||||||
autocmd BufNew * set shell=foo
|
autocmd BufNew * set shell=foo
|
||||||
terminal]])
|
terminal]])
|
||||||
-- Verify that BufNew actually fired (else the test is useless).
|
-- Verify that BufNew actually fired (else the test is invalid).
|
||||||
ok('foo' == eval('&shell'))
|
eq('foo', eval('&shell'))
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
Loading…
Reference in New Issue
Block a user