Mercurial > vim
view src/testdir/test_textformat.vim @ 19053:cec4da73951a v8.2.0087
patch 8.2.0087: crash in command line expansion when out of memory
Commit: https://github.com/vim/vim/commit/61d7c0d52ca40ab8488c36e619d1e46503affd0b
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun Jan 5 14:38:40 2020 +0100
patch 8.2.0087: crash in command line expansion when out of memory
Problem: Crash in command line expansion when out of memory.
Solution: Check for NULL pointer. Also make ExpandGeneric() static.
(Dominique Pelle, closes #5437)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 05 Jan 2020 14:45:04 +0100 |
parents | e8fe65da4198 |
children | b8fd7364befd |
line wrap: on
line source
" Tests for the various 'formatoptions' settings source check.vim func Test_text_format() enew! setl noai tw=2 fo=t call append('$', [ \ '{', \ ' ', \ '', \ '}']) exe "normal /^{/+1\n0" normal gRa b let lnum = line('.') call assert_equal([ \ 'a', \ 'b'], getline(lnum - 1, lnum)) normal ggdG setl ai tw=2 fo=tw call append('$', [ \ '{', \ 'a b ', \ '', \ 'a ', \ '}']) exe "normal /^{/+1\n0" normal gqgqjjllab let lnum = line('.') call assert_equal([ \ 'a ', \ 'b ', \ '', \ 'a ', \ 'b'], getline(lnum - 4, lnum)) normal ggdG setl tw=3 fo=t call append('$', [ \ '{', \ "a \<C-A>", \ '}']) exe "normal /^{/+1\n0" exe "normal gqgqo\na \<C-V>\<C-A>" let lnum = line('.') call assert_equal([ \ 'a', \ "\<C-A>", \ '', \ 'a', \ "\<C-A>"], getline(lnum - 4, lnum)) normal ggdG setl tw=2 fo=tcq1 comments=:# call append('$', [ \ '{', \ 'a b', \ '#a b', \ '}']) exe "normal /^{/+1\n0" exe "normal gqgqjgqgqo\na b\n#a b" let lnum = line('.') call assert_equal([ \ 'a b', \ '#a b', \ '', \ 'a b', \ '#a b'], getline(lnum - 4, lnum)) normal ggdG setl tw=5 fo=tcn comments=:# call append('$', [ \ '{', \ ' 1 a', \ '# 1 a', \ '}']) exe "normal /^{/+1\n0" exe "normal A b\<Esc>jA b" let lnum = line('.') call assert_equal([ \ ' 1 a', \ ' b', \ '# 1 a', \ '# b'], getline(lnum - 3, lnum)) normal ggdG setl tw=5 fo=t2a si call append('$', [ \ '{', \ '', \ ' x a', \ ' b', \ ' c', \ '', \ '}']) exe "normal /^{/+3\n0" exe "normal i \<Esc>A_" let lnum = line('.') call assert_equal([ \ '', \ ' x a', \ ' b_', \ ' c', \ ''], getline(lnum - 2, lnum + 2)) normal ggdG setl tw=5 fo=qn comments=:# call append('$', [ \ '{', \ '# 1 a b', \ '}']) exe "normal /^{/+1\n5|" normal gwap call assert_equal(5, col('.')) let lnum = line('.') call assert_equal([ \ '# 1 a', \ '# b'], getline(lnum, lnum + 1)) normal ggdG setl tw=5 fo=q2 comments=:# call append('$', [ \ '{', \ '# x', \ '# a b', \ '}']) exe "normal /^{/+1\n0" normal gwap let lnum = line('.') call assert_equal([ \ '# x a', \ '# b'], getline(lnum, lnum + 1)) normal ggdG setl tw& fo=a call append('$', [ \ '{', \ ' 1aa', \ ' 2bb', \ '}']) exe "normal /^{/+2\n0" normal I^^ call assert_equal('{ 1aa ^^2bb }', getline('.')) normal ggdG setl tw=20 fo=an12wcq comments=s1:/*,mb:*,ex:*/ call append('$', [ \ '/* abc def ghi jkl ', \ ' * mno pqr stu', \ ' */']) exe "normal /mno pqr/\n" normal A vwx yz let lnum = line('.') call assert_equal([ \ ' * mno pqr stu ', \ ' * vwx yz', \ ' */'], getline(lnum - 1, lnum + 1)) normal ggdG setl tw=12 fo=tqnc comments=:# call setline('.', '# 1 xxxxx') normal A foobar call assert_equal([ \ '# 1 xxxxx', \ '# foobar'], getline(1, 2)) " Test the 'p' flag for 'formatoptions' " First test without the flag: that it will break "Mr. Feynman" at the space normal ggdG setl tw=28 fo=tcq call setline('.', 'Surely you''re joking, Mr. Feynman!') normal gqq call assert_equal([ \ 'Surely you''re joking, Mr.', \ 'Feynman!'], getline(1, 2)) " Now test with the flag: that it will push the name with the title onto the " next line normal ggdG setl fo+=p call setline('.', 'Surely you''re joking, Mr. Feynman!') normal gqq call assert_equal([ \ 'Surely you''re joking,', \ 'Mr. Feynman!'], getline(1, 2)) " Ensure that it will still break if two spaces are entered normal ggdG call setline('.', 'Surely you''re joking, Mr. Feynman!') normal gqq call assert_equal([ \ 'Surely you''re joking, Mr.', \ 'Feynman!'], getline(1, 2)) setl ai& tw& fo& si& comments& enew! endfunc " Tests for :right, :center and :left on text with embedded TAB. func Test_format_align() enew! set tw=65 " :left alignment call append(0, [ \ " test for :left", \ " a a", \ " fa a", \ " dfa a", \ " sdfa a", \ " asdfa a", \ " xasdfa a", \ "asxxdfa a", \ ]) %left call assert_equal([ \ "test for :left", \ "a a", \ "fa a", \ "dfa a", \ "sdfa a", \ "asdfa a", \ "xasdfa a", \ "asxxdfa a", \ "" \ ], getline(1, '$')) enew! " :center alignment call append(0, [ \ " test for :center", \ " a a", \ " fa afd asdf", \ " dfa a", \ " sdfa afd asdf", \ " asdfa a", \ " xasdfa asdfasdfasdfasdfasdf", \ "asxxdfa a" \ ]) %center call assert_equal([ \ " test for :center", \ " a a", \ " fa afd asdf", \ " dfa a", \ " sdfa afd asdf", \ " asdfa a", \ " xasdfa asdfasdfasdfasdfasdf", \ " asxxdfa a", \ "" \ ], getline(1, '$')) enew! " :right alignment call append(0, [ \ " test for :right", \ " a a", \ " fa a", \ " dfa a", \ " sdfa a", \ " asdfa a", \ " xasdfa a", \ " asxxdfa a", \ " asxa;ofa a", \ " asdfaqwer a", \ " a ax", \ " fa ax", \ " dfa ax", \ " sdfa ax", \ " asdfa ax", \ " xasdfa ax", \ " asxxdfa ax", \ " asxa;ofa ax", \ " asdfaqwer ax", \ " a axx", \ " fa axx", \ " dfa axx", \ " sdfa axx", \ " asdfa axx", \ " xasdfa axx", \ " asxxdfa axx", \ " asxa;ofa axx", \ " asdfaqwer axx", \ " a axxx", \ " fa axxx", \ " dfa axxx", \ " sdfa axxx", \ " asdfa axxx", \ " xasdfa axxx", \ " asxxdfa axxx", \ " asxa;ofa axxx", \ " asdfaqwer axxx", \ " a axxxo", \ " fa axxxo", \ " dfa axxxo", \ " sdfa axxxo", \ " asdfa axxxo", \ " xasdfa axxxo", \ " asxxdfa axxxo", \ " asxa;ofa axxxo", \ " asdfaqwer axxxo", \ " a axxxoi", \ " fa axxxoi", \ " dfa axxxoi", \ " sdfa axxxoi", \ " asdfa axxxoi", \ " xasdfa axxxoi", \ " asxxdfa axxxoi", \ " asxa;ofa axxxoi", \ " asdfaqwer axxxoi", \ " a axxxoik", \ " fa axxxoik", \ " dfa axxxoik", \ " sdfa axxxoik", \ " asdfa axxxoik", \ " xasdfa axxxoik", \ " asxxdfa axxxoik", \ " asxa;ofa axxxoik", \ " asdfaqwer axxxoik", \ " a axxxoike", \ " fa axxxoike", \ " dfa axxxoike", \ " sdfa axxxoike", \ " asdfa axxxoike", \ " xasdfa axxxoike", \ " asxxdfa axxxoike", \ " asxa;ofa axxxoike", \ " asdfaqwer axxxoike", \ " a axxxoikey", \ " fa axxxoikey", \ " dfa axxxoikey", \ " sdfa axxxoikey", \ " asdfa axxxoikey", \ " xasdfa axxxoikey", \ " asxxdfa axxxoikey", \ " asxa;ofa axxxoikey", \ " asdfaqwer axxxoikey", \ ]) %right call assert_equal([ \ "\t\t\t\t test for :right", \ "\t\t\t\t a a", \ "\t\t\t\t fa a", \ "\t\t\t\t dfa a", \ "\t\t\t\t sdfa a", \ "\t\t\t\t asdfa a", \ "\t\t\t\t xasdfa a", \ "\t\t\t\t asxxdfa a", \ "\t\t\t\t asxa;ofa a", \ "\t\t\t\t asdfaqwer a", \ "\t\t\t\t a ax", \ "\t\t\t\t fa ax", \ "\t\t\t\t dfa ax", \ "\t\t\t\t sdfa ax", \ "\t\t\t\t asdfa ax", \ "\t\t\t\t xasdfa ax", \ "\t\t\t\t asxxdfa ax", \ "\t\t\t\t asxa;ofa ax", \ "\t\t\t\t asdfaqwer ax", \ "\t\t\t\t a axx", \ "\t\t\t\t fa axx", \ "\t\t\t\t dfa axx", \ "\t\t\t\t sdfa axx", \ "\t\t\t\t asdfa axx", \ "\t\t\t\t xasdfa axx", \ "\t\t\t\t asxxdfa axx", \ "\t\t\t\t asxa;ofa axx", \ "\t\t\t\t asdfaqwer axx", \ "\t\t\t\t a axxx", \ "\t\t\t\t fa axxx", \ "\t\t\t\t dfa axxx", \ "\t\t\t\t sdfa axxx", \ "\t\t\t\t asdfa axxx", \ "\t\t\t\t xasdfa axxx", \ "\t\t\t\t asxxdfa axxx", \ "\t\t\t\t asxa;ofa axxx", \ "\t\t\t\t asdfaqwer axxx", \ "\t\t\t\t a axxxo", \ "\t\t\t\t fa axxxo", \ "\t\t\t\t dfa axxxo", \ "\t\t\t\t sdfa axxxo", \ "\t\t\t\t asdfa axxxo", \ "\t\t\t\t xasdfa axxxo", \ "\t\t\t\t asxxdfa axxxo", \ "\t\t\t\t asxa;ofa axxxo", \ "\t\t\t\t asdfaqwer axxxo", \ "\t\t\t\t a axxxoi", \ "\t\t\t\t fa axxxoi", \ "\t\t\t\t dfa axxxoi", \ "\t\t\t\t sdfa axxxoi", \ "\t\t\t\t asdfa axxxoi", \ "\t\t\t\t xasdfa axxxoi", \ "\t\t\t\t asxxdfa axxxoi", \ "\t\t\t\t asxa;ofa axxxoi", \ "\t\t\t\t asdfaqwer axxxoi", \ "\t\t\t\t a axxxoik", \ "\t\t\t\t fa axxxoik", \ "\t\t\t\t dfa axxxoik", \ "\t\t\t\t sdfa axxxoik", \ "\t\t\t\t asdfa axxxoik", \ "\t\t\t\t xasdfa axxxoik", \ "\t\t\t\t asxxdfa axxxoik", \ "\t\t\t\t asxa;ofa axxxoik", \ "\t\t\t\t asdfaqwer axxxoik", \ "\t\t\t\t a axxxoike", \ "\t\t\t\t fa axxxoike", \ "\t\t\t\t dfa axxxoike", \ "\t\t\t\t sdfa axxxoike", \ "\t\t\t\t asdfa axxxoike", \ "\t\t\t\t xasdfa axxxoike", \ "\t\t\t\t asxxdfa axxxoike", \ "\t\t\t\t asxa;ofa axxxoike", \ "\t\t\t\t asdfaqwer axxxoike", \ "\t\t\t\t a axxxoikey", \ "\t\t\t\t fa axxxoikey", \ "\t\t\t\t dfa axxxoikey", \ "\t\t\t\t sdfa axxxoikey", \ "\t\t\t\t asdfa axxxoikey", \ "\t\t\t\t xasdfa axxxoikey", \ "\t\t\t\t asxxdfa axxxoikey", \ "\t\t\t\t asxa;ofa axxxoikey", \ "\t\t\t\t asdfaqwer axxxoikey", \ "" \ ], getline(1, '$')) enew! set tw& endfunc " Test formatting a paragraph. func Test_format_para() enew! set fo+=tcroql tw=72 call append(0, [ \ "xxxxx xx xxxxxx ", \ "xxxxxxx xxxxxxxxx xxx xxxx xxxxx xxxxx xxx xx", \ "xxxxxxxxxxxxxxxxxx xxxxx xxxx, xxxx xxxx xxxx xxxx xxx xx xx", \ "xx xxxxxxx. xxxx xxxx.", \ "", \ "> xx xx, xxxx xxxx xxx xxxx xxx xxxxx xxx xxx xxxxxxx xxx xxxxx", \ "> xxxxxx xxxxxxx: xxxx xxxxxxx, xx xxxxxx xxxx xxxxxxxxxx" \ ]) exe "normal /xxxxxxxx$\<CR>" normal 0gq6kk call assert_equal([ \ "xxxxx xx xxxxxx xxxxxxx xxxxxxxxx xxx xxxx xxxxx xxxxx xxx xx", \ "xxxxxxxxxxxxxxxxxx xxxxx xxxx, xxxx xxxx xxxx xxxx xxx xx xx xx xxxxxxx.", \ "xxxx xxxx.", \ "", \ "> xx xx, xxxx xxxx xxx xxxx xxx xxxxx xxx xxx xxxxxxx xxx xxxxx xxxxxx", \ "> xxxxxxx: xxxx xxxxxxx, xx xxxxxx xxxx xxxxxxxxxx", \ "" \ ], getline(1, '$')) set fo& tw& enew! endfunc " Test undo after ":%s" and formatting. func Test_format_undo() enew! map gg :.,.+2s/^/x/<CR>kk:set tw=3<CR>gqq call append(0, [ \ "aa aa aa aa", \ "bb bb bb bb", \ "cc cc cc cc" \ ]) " undo/redo here to make the next undo only work on the following changes exe "normal i\<C-G>u" call cursor(1,1) normal ggu call assert_equal([ \ "aa aa aa aa", \ "bb bb bb bb", \ "cc cc cc cc", \ "" \ ], getline(1, '$')) unmap gg set tw& enew! endfunc func Test_format_list_auto() new call setline(1, ['1. abc', '2. def', '3. ghi']) set fo=tan ai bs=2 call feedkeys("3G0lli\<BS>\<BS>x\<Esc>", 'tx') call assert_equal('2. defx ghi', getline(2)) bwipe! set fo& ai& bs& endfunc func Test_crash_github_issue_5095() CheckFeature autocmd " This used to segfault, see https://github.com/vim/vim/issues/5095 augroup testing au BufNew x center augroup END next! x bw augroup testing au! augroup END augroup! testing endfunc " Test for formatting multi-byte text with 'fo=t' func Test_tw_2_fo_t() new let t =<< trim END { XYZ abc XYZ } END call setline(1, t) call cursor(2, 1) set tw=2 fo=t let t =<< trim END XYZ abc XYZ END exe "normal gqgqjgqgq" exe "normal o\n" . join(t, "\n") let expected =<< trim END { XYZ abc XYZ XYZ abc XYZ } END call assert_equal(expected, getline(1, '$')) set tw& fo& bwipe! endfunc " Test for formatting multi-byte text with 'fo=tm' and 'tw=1' func Test_tw_1_fo_tm() new let t =<< trim END { X Xa X a XY X Y } END call setline(1, t) call cursor(2, 1) set tw=1 fo=tm let t =<< trim END X Xa X a XY X Y END exe "normal gqgqjgqgqjgqgqjgqgqjgqgq" exe "normal o\n" . join(t, "\n") let expected =<< trim END { X X a X a X Y X Y X X a X a X Y X Y } END call assert_equal(expected, getline(1, '$')) set tw& fo& bwipe! endfunc " Test for formatting multi-byte text with 'fo=tm' and 'tw=2' func Test_tw_2_fo_tm() new let t =<< trim END { X Xa X a XY X Y aX abX abcX abX c abXY } END call setline(1, t) call cursor(2, 1) set tw=2 fo=tm let t =<< trim END X Xa X a XY X Y aX abX abcX abX c abXY END exe "normal gqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgq" exe "normal o\n" . join(t, "\n") let expected =<< trim END { X X a X a X Y X Y a X ab X abc X ab X c ab X Y X X a X a X Y X Y a X ab X abc X ab X c ab X Y } END call assert_equal(expected, getline(1, '$')) set tw& fo& bwipe! endfunc " Test for formatting multi-byte text with 'fo=tm', 'tw=2' and 'autoindent'. func Test_tw_2_fo_tm_ai() new let t =<< trim END { X Xa } END call setline(1, t) call cursor(2, 1) set ai tw=2 fo=tm let t =<< trim END X Xa END exe "normal gqgqjgqgq" exe "normal o\n" . join(t, "\n") let expected =<< trim END { X X a X X a } END call assert_equal(expected, getline(1, '$')) set tw& fo& ai& bwipe! endfunc " Test for formatting multi-byte text with 'fo=tm', 'tw=2' and 'noai'. func Test_tw_2_fo_tm_noai() new let t =<< trim END { X Xa } END call setline(1, t) call cursor(2, 1) set noai tw=2 fo=tm exe "normal gqgqjgqgqo\n X\n Xa" let expected =<< trim END { X X a X X a } END call assert_equal(expected, getline(1, '$')) set tw& fo& ai& bwipe! endfunc func Test_tw_2_fo_cqm_com() new let t =<< trim END { X Xa XaY XY XYZ X Y X YZ XX XXa XXY } END call setline(1, t) call cursor(2, 1) set tw=2 fo=cqm comments=n:X exe "normal gqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgq" let t =<< trim END X Xa XaY XY XYZ X Y X YZ XX XXa XXY END exe "normal o\n" . join(t, "\n") let expected =<< trim END { X Xa Xa XY XY XY XZ X Y X Y X Z XX XXa XXY X Xa Xa XY XY XY XZ X Y X Y X Z XX XXa XXY } END call assert_equal(expected, getline(1, '$')) set tw& fo& comments& bwipe! endfunc func Test_tw_2_fo_tm_replace() new let t =<< trim END { } END call setline(1, t) call cursor(2, 1) set tw=2 fo=tm exe "normal RXa" let expected =<< trim END { X a } END call assert_equal(expected, getline(1, '$')) set tw& fo& bwipe! endfunc " Test for 'matchpairs' with multibyte chars func Test_mps() new let t =<< trim END { ‘ two three ’ four } END call setline(1, t) call cursor(2, 1) exe "set mps+=\u2018:\u2019" normal d% let expected =<< trim END { four } END call assert_equal(expected, getline(1, '$')) set mps& bwipe! endfunc " Test for ra on multi-byte characters func Test_ra_multibyte() new let t =<< trim END ra test abba aab END call setline(1, t) call cursor(1, 1) normal jVjra let expected =<< trim END ra test aaaa aaa END call assert_equal(expected, getline(1, '$')) bwipe! endfunc " Test for 'whichwrap' with multi-byte character func Test_whichwrap_multi_byte() new let t =<< trim END á x END call setline(1, t) call cursor(2, 1) set whichwrap+=h normal dh set whichwrap& let expected =<< trim END áx END call assert_equal(expected, getline(1, '$')) bwipe! endfunc func Test_substitute() call assert_equal('a1a2a3a', substitute('123', '\zs', 'a', 'g')) endfunc " vim: shiftwidth=2 sts=2 expandtab