From: Bram Moolenaar Date: Mon, 15 Oct 2018 20:51:50 +0000 (+0200) Subject: patch 8.1.0479: failure when setting 'varsofttabstop' to end in a comma X-Git-Tag: v8.1.0479 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=64f410742f101d7d5ea9e65503e1e0019605eaa5;p=vim 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 index d70dc7b5d..d1f1d1382 100644 --- 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) + for (cp = var; *cp != NUL; ++cp) { - if (cp == var || *(cp - 1) == ',') + 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 index c43e17830..c8470952d 100644 --- 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 index 4a5c4b77e..350c8a7ac 100644 --- a/src/version.c +++ b/src/version.c @@ -792,6 +792,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 479, /**/ 478, /**/