summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorK.Takata <kentkt@csc.jp>2022-07-30 15:43:59 +0100
committerBram Moolenaar <Bram@vim.org>2022-07-30 15:43:59 +0100
commitd90f91fe3075bb51668ed926182b2163da9df001 (patch)
tree44a94d1432fd4bbae2d1acfba88a8e03f497719e
parent0f823c360947779d9de6048c6bce51c670a06eb6 (diff)
patch 9.0.0113: has() is not strict about parsing the patch versionv9.0.0113
Problem: has() is not strict about parsing the patch version. Solution: Check the version more strictly. (Ken Takata, closes #10752)
-rw-r--r--src/evalfunc.c31
-rw-r--r--src/testdir/test_expr.vim9
-rw-r--r--src/version.c2
3 files changed, 30 insertions, 12 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 9b09caab73..ef66aedf9a 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -6458,19 +6458,26 @@ f_has(typval_T *argvars, typval_T *rettv)
x = TRUE;
if (name[5] == '-'
&& STRLEN(name) >= 11
- && vim_isdigit(name[6])
- && vim_isdigit(name[8])
- && vim_isdigit(name[10]))
+ && (name[6] >= '1' && name[6] <= '9'))
{
- int major = atoi((char *)name + 6);
- int minor = atoi((char *)name + 8);
-
- // Expect "patch-9.9.01234".
- n = (major < VIM_VERSION_MAJOR
- || (major == VIM_VERSION_MAJOR
- && (minor < VIM_VERSION_MINOR
- || (minor == VIM_VERSION_MINOR
- && has_patch(atoi((char *)name + 10))))));
+ char *end;
+ int major, minor;
+
+ // This works for patch-8.1.2, patch-9.0.3, patch-10.0.4, etc.
+ // Not for patch-9.10.5.
+ major = (int)strtoul((char *)name + 6, &end, 10);
+ if (*end == '.' && vim_isdigit(end[1])
+ && end[2] == '.' && vim_isdigit(end[3]))
+ {
+ minor = atoi(end + 1);
+
+ // Expect "patch-9.9.01234".
+ n = (major < VIM_VERSION_MAJOR
+ || (major == VIM_VERSION_MAJOR
+ && (minor < VIM_VERSION_MINOR
+ || (minor == VIM_VERSION_MINOR
+ && has_patch(atoi(end + 3))))));
+ }
}
else if (isdigit(name[5]))
n = has_patch(atoi((char *)name + 5));
diff --git a/src/testdir/test_expr.vim b/src/testdir/test_expr.vim
index f911cd933f..78d5919757 100644
--- a/src/testdir/test_expr.vim
+++ b/src/testdir/test_expr.vim
@@ -35,13 +35,22 @@ func Test_version()
call assert_true(has('patch-6.9.999'))
call assert_true(has('patch-7.1.999'))
call assert_true(has('patch-7.4.123'))
+ call assert_true(has('patch-7.4.123 ')) " Traling space can be allowed.
call assert_false(has('patch-7'))
call assert_false(has('patch-7.4'))
call assert_false(has('patch-7.4.'))
call assert_false(has('patch-9.1.0'))
call assert_false(has('patch-9.9.1'))
+
call assert_false(has('patch-abc'))
+ call assert_false(has('patchabc'))
+
+ call assert_false(has('patch-8x001'))
+ call assert_false(has('patch-9X0X0'))
+ call assert_false(has('patch-9-0-0'))
+ call assert_false(has('patch-09.0.0'))
+ call assert_false(has('patch-9.00.0'))
endfunc
func Test_op_ternary()
diff --git a/src/version.c b/src/version.c
index 4a79784b29..0a6fc7253d 100644
--- a/src/version.c
+++ b/src/version.c
@@ -736,6 +736,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 113,
+/**/
112,
/**/
111,