summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-11-05 19:36:38 +0100
committerBram Moolenaar <Bram@vim.org>2020-11-05 19:36:38 +0100
commit00806bceb6dc9c8dcd308e5f7e50f720f7dc71b0 (patch)
treebf1d99fc4d9567c97dc56b4e6d0edffd74981b7e
parentb885b435d126d34475714e39ec1125bd4e1c77c6 (diff)
patch 8.2.1959: crash when terminal buffer name is made emptyv8.2.1959
Problem: Crash when terminal buffer name is made empty. (Dhiraj Mishra) Solution: Fall back to "[No Name]". (closes #7262)
-rw-r--r--src/buffer.c13
-rw-r--r--src/proto/buffer.pro1
-rw-r--r--src/terminal.c8
-rw-r--r--src/testdir/test_terminal.vim10
-rw-r--r--src/version.c2
5 files changed, 30 insertions, 4 deletions
diff --git a/src/buffer.c b/src/buffer.c
index c804348e19..a4c6a00b53 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -5648,11 +5648,22 @@ buf_spname(buf_T *buf)
}
if (buf->b_fname == NULL)
- return (char_u *)_("[No Name]");
+ return buf_get_fname(buf);
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.
*/
void
diff --git a/src/proto/buffer.pro b/src/proto/buffer.pro
index 3fdcc69497..82bcaf3c1f 100644
--- a/src/proto/buffer.pro
+++ b/src/proto/buffer.pro
@@ -66,6 +66,7 @@ int bt_dontwrite(buf_T *buf);
int bt_dontwrite_msg(buf_T *buf);
int buf_hide(buf_T *buf);
char_u *buf_spname(buf_T *buf);
+char_u *buf_get_fname(buf_T *buf);
void set_buflisted(int on);
int buf_contents_changed(buf_T *buf);
void wipe_buffer(buf_T *buf, int aucmd);
diff --git a/src/terminal.c b/src/terminal.c
index 7c784b35df..ff3e3bd6a5 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -1598,7 +1598,7 @@ term_try_stop_job(buf_T *buf)
char_u buff[DIALOG_MSG_SIZE];
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);
if (ret == VIM_YES)
how = "kill";
@@ -4517,6 +4517,7 @@ term_get_status_text(term_T *term)
{
char_u *txt;
size_t len;
+ char_u *fname;
if (term->tl_normal_mode)
{
@@ -4533,11 +4534,12 @@ term_get_status_text(term_T *term)
txt = (char_u *)_("running");
else
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);
if (term->tl_status_text != NULL)
vim_snprintf((char *)term->tl_status_text, len, "%s [%s]",
- term->tl_buffer->b_fname, txt);
+ fname, txt);
}
return term->tl_status_text;
}
diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim
index f5b99bcc88..ece8120d58 100644
--- a/src/testdir/test_terminal.vim
+++ b/src/testdir/test_terminal.vim
@@ -41,6 +41,16 @@ func Test_terminal_basic()
unlet g:job
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()
au TerminalWinOpen * let b:done = 'yes'
let buf = Run_shell_in_terminal({})
diff --git a/src/version.c b/src/version.c
index ef4be7d639..f5d94cc724 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1959,
+/**/
1958,
/**/
1957,