From 5f0c76b243aca8d5fcab15c24bf2b0ba33852155 Mon Sep 17 00:00:00 2001 From: James McCoy Date: Fri, 25 Mar 2016 14:17:10 -0400 Subject: vim-patch:7.4.1641 Problem: Using unterminated string. Solution: Add NUL before calling vim_strsave_shellescape(). (James McCoy) https://github.com/vim/vim/commit/5ca84ce4aa2832041f843e624c222bbc1f4d3e14 --- src/nvim/eval.c | 2 ++ src/nvim/version.c | 1 + test/functional/legacy/105_filename_modifiers_spec.lua | 2 ++ 3 files changed, 5 insertions(+) diff --git a/src/nvim/eval.c b/src/nvim/eval.c index f71620a7b4..3856edbef9 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -21993,6 +21993,8 @@ repeat: } if (src[*usedlen] == ':' && src[*usedlen + 1] == 'S') { + // vim_strsave_shellescape() needs a NUL terminated string. + (*fnamep)[*fnamelen] = NUL; p = vim_strsave_shellescape(*fnamep, false, false); xfree(*bufp); *bufp = *fnamep = p; diff --git a/src/nvim/version.c b/src/nvim/version.c index 98abb30b00..b7e5f1f2ef 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -69,6 +69,7 @@ static char *features[] = { // clang-format off static int included_patches[] = { + 1641, 1574, 1570, 1511, diff --git a/test/functional/legacy/105_filename_modifiers_spec.lua b/test/functional/legacy/105_filename_modifiers_spec.lua index 3413667022..5ce2024889 100644 --- a/test/functional/legacy/105_filename_modifiers_spec.lua +++ b/test/functional/legacy/105_filename_modifiers_spec.lua @@ -43,6 +43,7 @@ describe('filename modifiers', function() execute([=[Put fnamemodify('abc'' ''def', ':S' )]=]) execute([=[Put fnamemodify('abc''%''def', ':S' )]=]) execute([=[Put fnamemodify("abc\ndef", ':S' )]=]) + execute([=[Put expand('%:r:S') == shellescape(expand('%:r'))]=]) execute([=[set shell=tcsh]=]) execute([=[Put fnamemodify("abc\ndef", ':S' )]=]) execute([=[1 delete _]=]) @@ -76,6 +77,7 @@ describe('filename modifiers', function() fnamemodify('abc'' ''def', ':S' ) '''abc''\'''' ''\''''def''' fnamemodify('abc''%''def', ':S' ) '''abc''\''''%''\''''def''' fnamemodify("abc\ndef", ':S' ) '''abc^@def''' + expand('%:r:S') == shellescape(expand('%:r')) 1 fnamemodify("abc\ndef", ':S' ) '''abc\^@def''']=]) end) end) -- cgit From e4d1bf7177e00eb41928bd17ae4c3c936f047053 Mon Sep 17 00:00:00 2001 From: James McCoy Date: Fri, 25 Mar 2016 14:20:29 -0400 Subject: vim-patch:7.4.1643 Problem: Terminating file name has side effects. Solution: Restore the character. (mostly by James McCoy, closes vim/vim#713) https://github.com/vim/vim/commit/d4caf5c16a9f1c9477d426e58d8d3dc47ab5f066 --- src/nvim/eval.c | 2 ++ src/nvim/version.c | 1 + test/functional/legacy/105_filename_modifiers_spec.lua | 4 ++++ 3 files changed, 7 insertions(+) diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 3856edbef9..fbde845f47 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -21994,8 +21994,10 @@ repeat: if (src[*usedlen] == ':' && src[*usedlen + 1] == 'S') { // vim_strsave_shellescape() needs a NUL terminated string. + c = (*fnamep)[*fnamelen]; (*fnamep)[*fnamelen] = NUL; p = vim_strsave_shellescape(*fnamep, false, false); + (*fnamep)[*fnamelen] = c; xfree(*bufp); *bufp = *fnamep = p; *fnamelen = STRLEN(p); diff --git a/src/nvim/version.c b/src/nvim/version.c index b7e5f1f2ef..0889ba8ccf 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -69,6 +69,7 @@ static char *features[] = { // clang-format off static int included_patches[] = { + 1643, 1641, 1574, 1570, diff --git a/test/functional/legacy/105_filename_modifiers_spec.lua b/test/functional/legacy/105_filename_modifiers_spec.lua index 5ce2024889..f7eb48e1da 100644 --- a/test/functional/legacy/105_filename_modifiers_spec.lua +++ b/test/functional/legacy/105_filename_modifiers_spec.lua @@ -44,6 +44,9 @@ describe('filename modifiers', function() execute([=[Put fnamemodify('abc''%''def', ':S' )]=]) execute([=[Put fnamemodify("abc\ndef", ':S' )]=]) execute([=[Put expand('%:r:S') == shellescape(expand('%:r'))]=]) + execute([=[new foo.txt]=]) + execute([=[Put join([expand('%:r'), expand('%:r:S'), expand('%')], ',')]=]) + execute([=[quit]=]) execute([=[set shell=tcsh]=]) execute([=[Put fnamemodify("abc\ndef", ':S' )]=]) execute([=[1 delete _]=]) @@ -77,6 +80,7 @@ describe('filename modifiers', function() fnamemodify('abc'' ''def', ':S' ) '''abc''\'''' ''\''''def''' fnamemodify('abc''%''def', ':S' ) '''abc''\''''%''\''''def''' fnamemodify("abc\ndef", ':S' ) '''abc^@def''' + join([expand('%:r'), expand('%:r:S'), expand('%')], ',') 'foo,''foo'',foo.txt' expand('%:r:S') == shellescape(expand('%:r')) 1 fnamemodify("abc\ndef", ':S' ) '''abc\^@def''']=]) end) -- cgit From 62c0d99474eb0dffcd36d227057755c16c8a9570 Mon Sep 17 00:00:00 2001 From: James McCoy Date: Fri, 25 Mar 2016 14:28:03 -0400 Subject: vim-patch:7.4.1652 Problem: Old style test for fnamemodify(). Solution: Turn it into a new style test. https://github.com/vim/vim/commit/610cc1b9b3c8104382f5506606c1f87118c28114 --- src/nvim/version.c | 1 + .../legacy/105_filename_modifiers_spec.lua | 87 ---------------------- test/functional/legacy/fnamemodify_spec.lua | 64 ++++++++++++++++ 3 files changed, 65 insertions(+), 87 deletions(-) delete mode 100644 test/functional/legacy/105_filename_modifiers_spec.lua create mode 100644 test/functional/legacy/fnamemodify_spec.lua diff --git a/src/nvim/version.c b/src/nvim/version.c index 0889ba8ccf..bab3d1573a 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -69,6 +69,7 @@ static char *features[] = { // clang-format off static int included_patches[] = { + 1652, 1643, 1641, 1574, diff --git a/test/functional/legacy/105_filename_modifiers_spec.lua b/test/functional/legacy/105_filename_modifiers_spec.lua deleted file mode 100644 index f7eb48e1da..0000000000 --- a/test/functional/legacy/105_filename_modifiers_spec.lua +++ /dev/null @@ -1,87 +0,0 @@ --- Test filename modifiers. - -local helpers = require('test.functional.helpers') -local clear = helpers.clear -local execute, expect = helpers.execute, helpers.expect - -describe('filename modifiers', function() - setup(clear) - - it('is working', function() - local tmpdir = helpers.nvim('eval', 'resolve("/tmp")') - - execute('cd ' .. tmpdir) - execute([=[set shell=sh]=]) - execute([=[set shellslash]=]) - execute([=[let tab="\t"]=]) - execute([=[command -nargs=1 Put :let expr= | $put =expr.tab.strtrans(string(eval(expr)))]=]) - execute([=[let $HOME=fnamemodify('.', ':p:h:h:h')]=]) - execute([=[Put fnamemodify('.', ':p' )[-1:]]=]) - execute([=[Put fnamemodify('.', ':p:h' )[-1:]]=]) - execute([=[Put fnamemodify('test.out', ':p' )[-1:]]=]) - execute([=[Put fnamemodify('test.out', ':.' )]=]) - execute([=[Put fnamemodify('../testdir/a', ':.' )]=]) - execute([=[Put fnamemodify('test.out', ':~' )]=]) - execute([=[Put fnamemodify('../testdir/a', ':~' )]=]) - execute([=[Put fnamemodify('../testdir/a', ':t' )]=]) - execute([=[Put fnamemodify('.', ':p:t' )]=]) - execute([=[Put fnamemodify('test.out', ':p:t' )]=]) - execute([=[Put fnamemodify('test.out', ':p:e' )]=]) - execute([=[Put fnamemodify('test.out', ':p:t:e' )]=]) - execute([=[Put fnamemodify('abc.fb2.tar.gz', ':r' )]=]) - execute([=[Put fnamemodify('abc.fb2.tar.gz', ':r:r' )]=]) - execute([=[Put fnamemodify('abc.fb2.tar.gz', ':r:r:r' )]=]) - execute([=[Put substitute(fnamemodify('abc.fb2.tar.gz', ':p:r:r'), '.*\(nvim/testdir/.*\)', '\1', '')]=]) - execute([=[Put fnamemodify('abc.fb2.tar.gz', ':e' )]=]) - execute([=[Put fnamemodify('abc.fb2.tar.gz', ':e:e' )]=]) - execute([=[Put fnamemodify('abc.fb2.tar.gz', ':e:e:e' )]=]) - execute([=[Put fnamemodify('abc.fb2.tar.gz', ':e:e:e:e')]=]) - execute([=[Put fnamemodify('abc.fb2.tar.gz', ':e:e:r' )]=]) - execute([=[Put fnamemodify('abc def', ':S' )]=]) - execute([=[Put fnamemodify('abc" "def', ':S' )]=]) - execute([=[Put fnamemodify('abc"%"def', ':S' )]=]) - execute([=[Put fnamemodify('abc'' ''def', ':S' )]=]) - execute([=[Put fnamemodify('abc''%''def', ':S' )]=]) - execute([=[Put fnamemodify("abc\ndef", ':S' )]=]) - execute([=[Put expand('%:r:S') == shellescape(expand('%:r'))]=]) - execute([=[new foo.txt]=]) - execute([=[Put join([expand('%:r'), expand('%:r:S'), expand('%')], ',')]=]) - execute([=[quit]=]) - execute([=[set shell=tcsh]=]) - execute([=[Put fnamemodify("abc\ndef", ':S' )]=]) - execute([=[1 delete _]=]) - - -- Assert buffer contents. - expect([=[ - fnamemodify('.', ':p' )[-1:] '/' - fnamemodify('.', ':p:h' )[-1:] 'p' - fnamemodify('test.out', ':p' )[-1:] 't' - fnamemodify('test.out', ':.' ) 'test.out' - fnamemodify('../testdir/a', ':.' ) '../testdir/a' - fnamemodify('test.out', ':~' ) 'test.out' - fnamemodify('../testdir/a', ':~' ) '../testdir/a' - fnamemodify('../testdir/a', ':t' ) 'a' - fnamemodify('.', ':p:t' ) '' - fnamemodify('test.out', ':p:t' ) 'test.out' - fnamemodify('test.out', ':p:e' ) 'out' - fnamemodify('test.out', ':p:t:e' ) 'out' - fnamemodify('abc.fb2.tar.gz', ':r' ) 'abc.fb2.tar' - fnamemodify('abc.fb2.tar.gz', ':r:r' ) 'abc.fb2' - fnamemodify('abc.fb2.tar.gz', ':r:r:r' ) 'abc' - substitute(fnamemodify('abc.fb2.tar.gz', ':p:r:r'), '.*\(nvim/testdir/.*\)', '\1', '') ']=] .. tmpdir .. [=[/abc.fb2' - fnamemodify('abc.fb2.tar.gz', ':e' ) 'gz' - fnamemodify('abc.fb2.tar.gz', ':e:e' ) 'tar.gz' - fnamemodify('abc.fb2.tar.gz', ':e:e:e' ) 'fb2.tar.gz' - fnamemodify('abc.fb2.tar.gz', ':e:e:e:e') 'fb2.tar.gz' - fnamemodify('abc.fb2.tar.gz', ':e:e:r' ) 'tar' - fnamemodify('abc def', ':S' ) '''abc def''' - fnamemodify('abc" "def', ':S' ) '''abc" "def''' - fnamemodify('abc"%"def', ':S' ) '''abc"%"def''' - fnamemodify('abc'' ''def', ':S' ) '''abc''\'''' ''\''''def''' - fnamemodify('abc''%''def', ':S' ) '''abc''\''''%''\''''def''' - fnamemodify("abc\ndef", ':S' ) '''abc^@def''' - join([expand('%:r'), expand('%:r:S'), expand('%')], ',') 'foo,''foo'',foo.txt' - expand('%:r:S') == shellescape(expand('%:r')) 1 - fnamemodify("abc\ndef", ':S' ) '''abc\^@def''']=]) - end) -end) diff --git a/test/functional/legacy/fnamemodify_spec.lua b/test/functional/legacy/fnamemodify_spec.lua new file mode 100644 index 0000000000..a439e91b6f --- /dev/null +++ b/test/functional/legacy/fnamemodify_spec.lua @@ -0,0 +1,64 @@ +-- Test filename modifiers. + +local helpers = require('test.functional.helpers') +local clear, source = helpers.clear, helpers.source +local call, eq, nvim = helpers.call, helpers.eq, helpers.meths + +local function expected_empty() + eq({}, nvim.get_vvar('errors')) +end + +describe('filename modifiers', function() + before_each(function() + clear() + + source([=[ + func Test_fnamemodify() + let tmpdir = resolve('/tmp') + execute 'cd '. tmpdir + set shell=sh + set shellslash + let $HOME=fnamemodify('.', ':p:h:h:h') + call assert_equal('/', fnamemodify('.', ':p')[-1:]) + call assert_equal('p', fnamemodify('.', ':p:h')[-1:]) + call assert_equal('t', fnamemodify('test.out', ':p')[-1:]) + call assert_equal('test.out', fnamemodify('test.out', ':.')) + call assert_equal('../testdir/a', fnamemodify('../testdir/a', ':.')) + call assert_equal('test.out', fnamemodify('test.out', ':~')) + call assert_equal('../testdir/a', fnamemodify('../testdir/a', ':~')) + call assert_equal('a', fnamemodify('../testdir/a', ':t')) + call assert_equal('', fnamemodify('.', ':p:t')) + call assert_equal('test.out', fnamemodify('test.out', ':p:t')) + call assert_equal('out', fnamemodify('test.out', ':p:e')) + call assert_equal('out', fnamemodify('test.out', ':p:t:e')) + call assert_equal('abc.fb2.tar', fnamemodify('abc.fb2.tar.gz', ':r')) + call assert_equal('abc.fb2', fnamemodify('abc.fb2.tar.gz', ':r:r')) + call assert_equal('abc', fnamemodify('abc.fb2.tar.gz', ':r:r:r')) + call assert_equal(tmpdir .'/abc.fb2', substitute(fnamemodify('abc.fb2.tar.gz', ':p:r:r'), '.*\(nvim/testdir/.*\)', '\1', '')) + call assert_equal('gz', fnamemodify('abc.fb2.tar.gz', ':e')) + call assert_equal('tar.gz', fnamemodify('abc.fb2.tar.gz', ':e:e')) + call assert_equal('fb2.tar.gz', fnamemodify('abc.fb2.tar.gz', ':e:e:e')) + call assert_equal('fb2.tar.gz', fnamemodify('abc.fb2.tar.gz', ':e:e:e:e')) + call assert_equal('tar', fnamemodify('abc.fb2.tar.gz', ':e:e:r')) + call assert_equal('''abc def''', fnamemodify('abc def', ':S')) + call assert_equal('''abc" "def''', fnamemodify('abc" "def', ':S')) + call assert_equal('''abc"%"def''', fnamemodify('abc"%"def', ':S')) + call assert_equal('''abc''\'''' ''\''''def''', fnamemodify('abc'' ''def', ':S')) + call assert_equal('''abc''\''''%''\''''def''', fnamemodify('abc''%''def', ':S')) + new foo.txt + call assert_equal(expand('%:r:S'), shellescape(expand('%:r'))) + call assert_equal('foo,''foo'',foo.txt', join([expand('%:r'), expand('%:r:S'), expand('%')], ',')) + quit + + call assert_equal("'abc\ndef'", fnamemodify("abc\ndef", ':S')) + set shell=tcsh + call assert_equal("'abc\\\ndef'", fnamemodify("abc\ndef", ':S')) + endfunc + ]=]) + end) + + it('is working', function() + call('Test_fnamemodify') + expected_empty() + end) +end) -- cgit From 7558f42f7d9900d37a1915ce78f1102ee251d420 Mon Sep 17 00:00:00 2001 From: James McCoy Date: Mon, 28 Mar 2016 09:47:46 -0400 Subject: vim-patch:7.4.1654 Problem: Crash when using expand('%:S') in a buffer without a name. Solution: Don't set a NUL. (James McCoy, closes vim/vim#714) https://github.com/vim/vim/commit/52c6eaffd43a8c8865f8d6ed7cde0a8b137479e2 --- src/nvim/eval.c | 8 ++++++-- src/nvim/version.c | 1 + test/functional/legacy/fnamemodify_spec.lua | 11 +++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/nvim/eval.c b/src/nvim/eval.c index fbde845f47..3c67625d1c 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -21995,9 +21995,13 @@ repeat: if (src[*usedlen] == ':' && src[*usedlen + 1] == 'S') { // vim_strsave_shellescape() needs a NUL terminated string. c = (*fnamep)[*fnamelen]; - (*fnamep)[*fnamelen] = NUL; + if (c != NUL) { + (*fnamep)[*fnamelen] = NUL; + } p = vim_strsave_shellescape(*fnamep, false, false); - (*fnamep)[*fnamelen] = c; + if (c != NUL) { + (*fnamep)[*fnamelen] = c; + } xfree(*bufp); *bufp = *fnamep = p; *fnamelen = STRLEN(p); diff --git a/src/nvim/version.c b/src/nvim/version.c index bab3d1573a..8cd0a13363 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -69,6 +69,7 @@ static char *features[] = { // clang-format off static int included_patches[] = { + 1654, 1652, 1643, 1641, diff --git a/test/functional/legacy/fnamemodify_spec.lua b/test/functional/legacy/fnamemodify_spec.lua index a439e91b6f..2a32aea127 100644 --- a/test/functional/legacy/fnamemodify_spec.lua +++ b/test/functional/legacy/fnamemodify_spec.lua @@ -54,6 +54,12 @@ describe('filename modifiers', function() set shell=tcsh call assert_equal("'abc\\\ndef'", fnamemodify("abc\ndef", ':S')) endfunc + + func Test_expand() + new + call assert_equal("", expand('%:S')) + quit + endfunc ]=]) end) @@ -61,4 +67,9 @@ describe('filename modifiers', function() call('Test_fnamemodify') expected_empty() end) + + it('works for :S in an unnamed buffer', function() + call('Test_expand') + expected_empty() + end) end) -- cgit