ex_getln: Do not goto color_cmdline_end without first cleaning up

The issue with debug mode was actually not cleaning up after `try_enter`: 
location `&tstate` was pointing to got invalidated and received some “garbage” 
(actually, values that got stored on the stack afterwards). But pointer to that 
garbage was still stored in `msg_list`, so next attempt to check it resulted in 
a crash.
This commit is contained in:
ZyX 2017-07-17 01:55:10 +03:00
parent 2a6423eba7
commit f4744e1821
2 changed files with 36 additions and 2 deletions

View File

@ -2372,8 +2372,6 @@ static bool color_cmdline(void)
dgc_ret = tv_dict_get_callback(&globvardict, S_LEN("Nvim_color_expr"),
&color_cb);
can_free_cb = true;
} else {
goto color_cmdline_end;
}
if (!try_leave(&tstate, &err) || !dgc_ret) {
goto color_cmdline_error;

View File

@ -121,6 +121,7 @@ before_each(function()
EOB={bold = true, foreground = Screen.colors.Blue1},
ERR={foreground = Screen.colors.Grey100, background = Screen.colors.Red},
SK={foreground = Screen.colors.Blue},
PE={bold = true, foreground = Screen.colors.SeaGreen4}
})
end)
@ -453,6 +454,41 @@ describe('Ex commands coloring support', function()
curbufmeths.get_lines(0, -1, false))
eq('', funcs.execute('messages'))
end)
it('does not crash when using `n` in debug mode', function()
feed(':debug execute "echo 1"\n')
screen:expect([[
{EOB:~ }|
{EOB:~ }|
{EOB:~ }|
{EOB:~ }|
Entering Debug mode. Type "cont" to con|
tinue. |
cmd: execute "echo 1" |
>^ |
]])
feed('n\n')
screen:expect([[
{EOB:~ }|
{EOB:~ }|
Entering Debug mode. Type "cont" to con|
tinue. |
cmd: execute "echo 1" |
>n |
1 |
{PE:Press ENTER or type command to continue}^ |
]])
feed('\n')
screen:expect([[
^ |
{EOB:~ }|
{EOB:~ }|
{EOB:~ }|
{EOB:~ }|
{EOB:~ }|
{EOB:~ }|
|
]])
end)
end)
-- TODO Specifically test for coloring in cmdline and expr modes