changeset 29544:80b4c435450a v9.0.0113

patch 9.0.0113: has() is not strict about parsing the patch version Commit: https://github.com/vim/vim/commit/d90f91fe3075bb51668ed926182b2163da9df001 Author: K.Takata <kentkt@csc.jp> Date: Sat Jul 30 15:43:59 2022 +0100 patch 9.0.0113: has() is not strict about parsing the patch version Problem: has() is not strict about parsing the patch version. Solution: Check the version more strictly. (Ken Takata, closes https://github.com/vim/vim/issues/10752)
author Bram Moolenaar <Bram@vim.org>
date Sat, 30 Jul 2022 16:45:05 +0200
parents b679513dc17c
children b544e30ddc6c
files src/evalfunc.c src/testdir/test_expr.vim src/version.c
diffstat 3 files changed, 30 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- 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));
--- 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()
--- 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,