1
0
forked from aniani/vim

patch 8.2.1959: crash when terminal buffer name is made empty

Problem:    Crash when terminal buffer name is made empty. (Dhiraj Mishra)
Solution:   Fall back to "[No Name]". (closes #7262)
This commit is contained in:
Bram Moolenaar 2020-11-05 19:36:38 +01:00
parent b885b435d1
commit 00806bceb6
5 changed files with 30 additions and 4 deletions

View File

@ -5648,10 +5648,21 @@ buf_spname(buf_T *buf)
} }
if (buf->b_fname == NULL) if (buf->b_fname == NULL)
return (char_u *)_("[No Name]"); return buf_get_fname(buf);
return NULL; return NULL;
} }
/*
* Get "buf->b_fname", use "[No Name]" if it is NULL.
*/
char_u *
buf_get_fname(buf_T *buf)
{
if (buf->b_fname == NULL)
return (char_u *)_("[No Name]");
return buf->b_fname;
}
/* /*
* Set 'buflisted' for curbuf to "on" and trigger autocommands if it changed. * Set 'buflisted' for curbuf to "on" and trigger autocommands if it changed.
*/ */

View File

@ -66,6 +66,7 @@ int bt_dontwrite(buf_T *buf);
int bt_dontwrite_msg(buf_T *buf); int bt_dontwrite_msg(buf_T *buf);
int buf_hide(buf_T *buf); int buf_hide(buf_T *buf);
char_u *buf_spname(buf_T *buf); char_u *buf_spname(buf_T *buf);
char_u *buf_get_fname(buf_T *buf);
void set_buflisted(int on); void set_buflisted(int on);
int buf_contents_changed(buf_T *buf); int buf_contents_changed(buf_T *buf);
void wipe_buffer(buf_T *buf, int aucmd); void wipe_buffer(buf_T *buf, int aucmd);

View File

@ -1598,7 +1598,7 @@ term_try_stop_job(buf_T *buf)
char_u buff[DIALOG_MSG_SIZE]; char_u buff[DIALOG_MSG_SIZE];
int ret; int ret;
dialog_msg(buff, _("Kill job in \"%s\"?"), buf->b_fname); dialog_msg(buff, _("Kill job in \"%s\"?"), buf_get_fname(buf));
ret = vim_dialog_yesnocancel(VIM_QUESTION, NULL, buff, 1); ret = vim_dialog_yesnocancel(VIM_QUESTION, NULL, buff, 1);
if (ret == VIM_YES) if (ret == VIM_YES)
how = "kill"; how = "kill";
@ -4517,6 +4517,7 @@ term_get_status_text(term_T *term)
{ {
char_u *txt; char_u *txt;
size_t len; size_t len;
char_u *fname;
if (term->tl_normal_mode) if (term->tl_normal_mode)
{ {
@ -4533,11 +4534,12 @@ term_get_status_text(term_T *term)
txt = (char_u *)_("running"); txt = (char_u *)_("running");
else else
txt = (char_u *)_("finished"); txt = (char_u *)_("finished");
len = 9 + STRLEN(term->tl_buffer->b_fname) + STRLEN(txt); fname = buf_get_fname(term->tl_buffer);
len = 9 + STRLEN(fname) + STRLEN(txt);
term->tl_status_text = alloc(len); term->tl_status_text = alloc(len);
if (term->tl_status_text != NULL) if (term->tl_status_text != NULL)
vim_snprintf((char *)term->tl_status_text, len, "%s [%s]", vim_snprintf((char *)term->tl_status_text, len, "%s [%s]",
term->tl_buffer->b_fname, txt); fname, txt);
} }
return term->tl_status_text; return term->tl_status_text;
} }

View File

@ -41,6 +41,16 @@ func Test_terminal_basic()
unlet g:job unlet g:job
endfunc endfunc
func Test_terminal_no_name()
let buf = Run_shell_in_terminal({})
call assert_match('^!', bufname(buf))
0file
call assert_equal("", bufname(buf))
call assert_match('\[No Name\]', execute('file'))
call StopShellInTerminal(buf)
call TermWait(buf)
endfunc
func Test_terminal_TerminalWinOpen() func Test_terminal_TerminalWinOpen()
au TerminalWinOpen * let b:done = 'yes' au TerminalWinOpen * let b:done = 'yes'
let buf = Run_shell_in_terminal({}) let buf = Run_shell_in_terminal({})

View File

@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1959,
/**/ /**/
1958, 1958,
/**/ /**/