# HG changeset patch # User Bram Moolenaar # Date 1539637205 -7200 # Node ID dc54785f9a1dbb4db3cbece9a8f2cb08ad13261b # Parent e28c806cf00461d70f56c622df570a1129a5e66e patch 8.1.0479: failure when setting 'varsofttabstop' to end in a comma commit https://github.com/vim/vim/commit/64f410742f101d7d5ea9e65503e1e0019605eaa5 Author: Bram Moolenaar Date: Mon Oct 15 22:51:50 2018 +0200 patch 8.1.0479: failure when setting 'varsofttabstop' to end in a comma Problem: Failure when setting 'varsofttabstop' to end in a comma. (Ralf Schandl) Solution: Reject value with trailing command. Add test for invalid values (closes #3544) diff --git a/src/option.c b/src/option.c --- a/src/option.c +++ b/src/option.c @@ -12786,17 +12786,18 @@ tabstop_set(char_u *var, int **array) int t; char_u *cp; - if ((!var[0] || (var[0] == '0' && !var[1]))) + if (var[0] == NUL || (var[0] == '0' && var[1] == NUL)) { *array = NULL; return TRUE; } - for (cp = var; *cp; ++cp) - { - if (cp == var || *(cp - 1) == ',') + for (cp = var; *cp != NUL; ++cp) + { + if (cp == var || cp[-1] == ',') { char_u *end; + if (strtol((char *)cp, (char **)&end, 10) <= 0) { if (cp != end) @@ -12809,7 +12810,7 @@ tabstop_set(char_u *var, int **array) if (VIM_ISDIGIT(*cp)) continue; - if (*cp == ',' && cp > var && *(cp - 1) != ',') + if (cp[0] == ',' && cp > var && cp[-1] != ',' && cp[1] != NUL) { ++valcount; continue; @@ -12818,16 +12819,16 @@ tabstop_set(char_u *var, int **array) return FALSE; } - *array = (int *) alloc((unsigned) ((valcount + 1) * sizeof(int))); + *array = (int *)alloc((unsigned) ((valcount + 1) * sizeof(int))); (*array)[0] = valcount; t = 1; - for (cp = var; *cp;) + for (cp = var; *cp != NUL;) { (*array)[t++] = atoi((char *)cp); - while (*cp && *cp != ',') + while (*cp != NUL && *cp != ',') ++cp; - if (*cp) + if (*cp != NUL) ++cp; } diff --git a/src/testdir/test_vartabs.vim b/src/testdir/test_vartabs.vim --- a/src/testdir/test_vartabs.vim +++ b/src/testdir/test_vartabs.vim @@ -5,11 +5,11 @@ if !has("vartabs") endif source view_util.vim -function! s:compare_lines(expect, actual) +func s:compare_lines(expect, actual) call assert_equal(join(a:expect, "\n"), join(a:actual, "\n")) -endfunction +endfunc -func! Test_vartabs() +func Test_vartabs() new %d @@ -261,7 +261,7 @@ func! Test_vartabs_breakindent() bwipeout! endfunc -func! Test_vartabs_linebreak() +func Test_vartabs_linebreak() if winwidth(0) < 40 return endif @@ -296,3 +296,14 @@ func! Test_vartabs_linebreak() bw! set nolist listchars&vim endfunc + +func Test_vartabs_failures() + call assert_fails('set vts=8,') + call assert_fails('set vsts=8,') + call assert_fails('set vts=8,,8') + call assert_fails('set vsts=8,,8') + call assert_fails('set vts=8,,8,') + call assert_fails('set vsts=8,,8,') + call assert_fails('set vts=,8') + call assert_fails('set vsts=,8') +endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -793,6 +793,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 479, +/**/ 478, /**/ 477,