aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBjörn Linse <bjorn.linse@gmail.com>2019-09-01 11:13:13 +0200
committerBjörn Linse <bjorn.linse@gmail.com>2019-09-30 19:05:54 +0200
commitdd26bd59745c9fd358624312feb315ec0f106de8 (patch)
treecab676dfb3bf83cf243fc5e78bab2f435cde7517 /src
parentdc52458522f23a0d50c7852af7191f7a92c263cb (diff)
downloadrneovim-dd26bd59745c9fd358624312feb315ec0f106de8.tar.gz
rneovim-dd26bd59745c9fd358624312feb315ec0f106de8.tar.bz2
rneovim-dd26bd59745c9fd358624312feb315ec0f106de8.zip
screen: don't crash on invalid grid cells being recomposed
Diffstat (limited to 'src')
-rw-r--r--src/nvim/option_defs.h3
-rw-r--r--src/nvim/ui_compositor.c14
2 files changed, 16 insertions, 1 deletions
diff --git a/src/nvim/option_defs.h b/src/nvim/option_defs.h
index 08df495250..108a3dde7c 100644
--- a/src/nvim/option_defs.h
+++ b/src/nvim/option_defs.h
@@ -518,10 +518,11 @@ EXTERN long p_pyx; // 'pyxversion'
EXTERN char_u *p_rdb; // 'redrawdebug'
EXTERN unsigned rdb_flags;
# ifdef IN_OPTION_C
-static char *(p_rdb_values[]) = { "compositor", "nothrottle", NULL };
+static char *(p_rdb_values[]) = { "compositor", "nothrottle", "invalid", NULL };
# endif
# define RDB_COMPOSITOR 0x001
# define RDB_NOTHROTTLE 0x002
+# define RDB_INVALID 0x004
EXTERN long p_rdt; // 'redrawtime'
EXTERN int p_remap; // 'remap'
diff --git a/src/nvim/ui_compositor.c b/src/nvim/ui_compositor.c
index 20ffc1b88e..7d3ecfa0b8 100644
--- a/src/nvim/ui_compositor.c
+++ b/src/nvim/ui_compositor.c
@@ -425,6 +425,15 @@ static void compose_line(Integer row, Integer startcol, Integer endcol,
flags = flags & ~kLineFlagWrap;
}
+ for (int i = skipstart; i < (endcol-skipend)-startcol; i++) {
+ if (attrbuf[i] < 0) {
+ if (rdb_flags & RDB_INVALID) {
+ abort();
+ } else {
+ attrbuf[i] = 0;
+ }
+ }
+ }
ui_composed_call_raw_line(1, row, startcol+skipstart,
endcol-skipend, endcol-skipend, 0, flags,
(const schar_T *)linebuf+skipstart,
@@ -535,6 +544,11 @@ static void ui_comp_raw_line(UI *ui, Integer grid, Integer row,
} else {
compose_debug(row, row+1, startcol, endcol, dbghl_normal, false);
compose_debug(row, row+1, endcol, clearcol, dbghl_clear, true);
+#ifndef NDEBUG
+ for (int i = 0; i < endcol-startcol; i++) {
+ assert(attrs[i] >= 0);
+ }
+#endif
ui_composed_call_raw_line(1, row, startcol, endcol, clearcol, clearattr,
flags, chunk, attrs);
}