# HG changeset patch # User Bram Moolenaar # Date 1626033605 -7200 # Node ID 34a6db7af738f52c82be5ffedc19c6d77145fc08 # Parent f6a78c6350ff4b9a320c3804fa154f62aea08b54 patch 8.2.3153: URLs with a dash in the scheme are not recognized Commit: https://github.com/vim/vim/commit/7b7a118e74d25ff35cd277c2bb5191ae44bb20b2 Author: Tsuyoshi CHO Date: Sun Jul 11 21:51:17 2021 +0200 patch 8.2.3153: URLs with a dash in the scheme are not recognized Problem: URLs with a dash in the scheme are not recognized. Solution: Allow for a scheme with a dash, but not at the start or end. (Tsuyoshi CHO, closes #8299) diff --git a/src/misc1.c b/src/misc1.c --- a/src/misc1.c +++ b/src/misc1.c @@ -2600,8 +2600,8 @@ path_is_url(char_u *p) } /* - * Check if "fname" starts with "name://". Return URL_SLASH if it does. - * Return URL_BACKSLASH for "name:\\". + * Check if "fname" starts with "name://" or "name:\\". + * Return URL_SLASH for "name://", URL_BACKSLASH for "name:\\". * Return zero otherwise. */ int @@ -2609,7 +2609,22 @@ path_with_url(char_u *fname) { char_u *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/testdir/test_buffer.vim b/src/testdir/test_buffer.vim --- a/src/testdir/test_buffer.vim +++ b/src/testdir/test_buffer.vim @@ -381,6 +381,35 @@ 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 + " Test for the 'maxmem' and 'maxmemtot' options func Test_buffer_maxmem() " use 1KB per buffer and 2KB for all the buffers diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -756,6 +756,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3153, +/**/ 3152, /**/ 3151,