diff options
| -rw-r--r-- | src/nvim/path.c | 24 | ||||
| -rw-r--r-- | src/nvim/testdir/test_buffer.vim | 31 | 
2 files changed, 52 insertions, 3 deletions
diff --git a/src/nvim/path.c b/src/nvim/path.c index 674d67e21a..b12dd57938 100644 --- a/src/nvim/path.c +++ b/src/nvim/path.c @@ -1743,14 +1743,32 @@ int path_is_url(const char *p)    return 0;  } -/// Check if "fname" starts with "name://".  Return URL_SLASH if it does. +/// Check if "fname" starts with "name://" or "name:\\".  ///  /// @param  fname         is the filename to test -/// @return URL_BACKSLASH for "name:\\", zero otherwise. +/// @return URL_SLASH for "name://", URL_BACKSLASH for "name:\\", zero otherwise.  int path_with_url(const char *fname)  {    const char *p; -  for (p = fname; isalpha(*p); p++) {} + +  // We accept alphabetic characters and a dash in scheme part. +  // RFC 3986 allows for more, but it increases the risk of matching +  // non-URL text. + +  // first character must be alpha +  if (!isalpha(*fname)) { +    return 0; +  } + +  // check body: alpha or dash +  for (p = fname; (isalpha(*p) || (*p == '-')); p++) {} + +  // check last char is not a dash +  if (p[-1] == '-') { +    return 0; +  } + +  // "://" or ":\\" must follow    return path_is_url(p);  } diff --git a/src/nvim/testdir/test_buffer.vim b/src/nvim/testdir/test_buffer.vim index 40111fdf06..a31cdbb49a 100644 --- a/src/nvim/testdir/test_buffer.vim +++ b/src/nvim/testdir/test_buffer.vim @@ -1,5 +1,7 @@  " Tests for Vim buffer +source check.vim +  func Test_buffer_error()    new foo1    new foo2 @@ -30,4 +32,33 @@ func Test_balt()    call assert_equal('OtherBuffer', bufname())  endfunc +" Test for buffer match URL(scheme) check +" scheme is alpha and inner hyphen only. +func Test_buffer_scheme() +  CheckMSWindows + +  set noshellslash +  %bwipe! +  let bufnames = [ +    \ #{id: 'b0', name: 'test://xyz/foo/b0'    , match: 1}, +    \ #{id: 'b1', name: 'test+abc://xyz/foo/b1', match: 0}, +    \ #{id: 'b2', name: 'test_abc://xyz/foo/b2', match: 0}, +    \ #{id: 'b3', name: 'test-abc://xyz/foo/b3', match: 1}, +    \ #{id: 'b4', name: '-test://xyz/foo/b4'   , match: 0}, +    \ #{id: 'b5', name: 'test-://xyz/foo/b5'   , match: 0}, +    \] +  for buf in bufnames +    new `=buf.name` +    if buf.match +      call assert_equal(buf.name,    getbufinfo(buf.id)[0].name) +    else +      " slashes will have become backslashes +      call assert_notequal(buf.name, getbufinfo(buf.id)[0].name) +    endif +    bwipe +  endfor + +  set shellslash& +endfunc +  " vim: shiftwidth=2 sts=2 expandtab  | 
