From e4a974c7cc6dea53b9457bbd29a4e48f221720cb Mon Sep 17 00:00:00 2001 From: Victor Adam Date: Wed, 17 Jun 2015 11:38:47 +0200 Subject: [PATCH 1/2] plines_win_nofold(): Ignore virtcols after 32000th computation #3527 Avoid crashing or hanging when editing a file than contains ludicrously long lines (more than 100,000,000 virtual columns). The change is in plines_win_nofold, which is called by wrapping and folding code. As a result, wrapping and folding may be done incorrectly when the UI is capable of rendering more than 32000 characters at a time (tiny font). fixes #2838 --- src/nvim/misc1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nvim/misc1.c b/src/nvim/misc1.c index 5270687a4d..2f02985875 100644 --- a/src/nvim/misc1.c +++ b/src/nvim/misc1.c @@ -1273,7 +1273,7 @@ int plines_win_nofold(win_T *wp, linenr_T lnum) * Add column offset for 'number', 'relativenumber' and 'foldcolumn'. */ width = wp->w_width - win_col_off(wp); - if (width <= 0) { + if (width <= 0 || col > 32000) { return 32000; // bigger than the number of lines of the screen } if (col <= (unsigned int)width) { From a3134bc4809dff52cc9a635103a48b48d7c2d148 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Sun, 22 Oct 2017 13:51:50 +0200 Subject: [PATCH 2/2] test: tabstop= #2838 --- src/nvim/misc1.c | 2 +- test/functional/options/tabstop_spec.lua | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 test/functional/options/tabstop_spec.lua diff --git a/src/nvim/misc1.c b/src/nvim/misc1.c index 2f02985875..137de84953 100644 --- a/src/nvim/misc1.c +++ b/src/nvim/misc1.c @@ -1274,7 +1274,7 @@ int plines_win_nofold(win_T *wp, linenr_T lnum) */ width = wp->w_width - win_col_off(wp); if (width <= 0 || col > 32000) { - return 32000; // bigger than the number of lines of the screen + return 32000; // bigger than the number of screen columns } if (col <= (unsigned int)width) { return 1; diff --git a/test/functional/options/tabstop_spec.lua b/test/functional/options/tabstop_spec.lua new file mode 100644 index 0000000000..dc3ba38438 --- /dev/null +++ b/test/functional/options/tabstop_spec.lua @@ -0,0 +1,23 @@ +local helpers = require('test.functional.helpers')(after_each) + +local clear = helpers.clear +local feed = helpers.feed +local eq = helpers.eq +local eval = helpers.eval + +describe("'tabstop' option", function() + before_each(function() + clear() + end) + + -- NOTE: Setting 'tabstop' to a big number reproduces crash #2838. + -- Disallowing big 'tabstop' would not fix #2838, only hide it. + it("tabstop= does not crash #2838", function() + -- Insert a character for 'tabstop' to work with. + feed('i') + -- Set 'tabstop' to a very high value. + -- Use feed(), not command(), to provoke crash. + feed(':set tabstop=3000000000') + eq(2, eval("1+1")) -- Still alive? + end) +end)