summaryrefslogtreecommitdiff
path: root/src/ex_getln.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-02-11 15:20:20 +0100
committerBram Moolenaar <Bram@vim.org>2018-02-11 15:20:20 +0100
commit71a43c01377cb0c5cdc5f2d9a357b5ef1aa69ee3 (patch)
tree09f8c71e210cc225e2dd9be0a7f50122fb35ea8e /src/ex_getln.c
parenta0221df149aa3773450b3f930299a409dd75bd5b (diff)
downloadvim-git-71a43c01377cb0c5cdc5f2d9a357b5ef1aa69ee3.tar.gz
patch 8.0.1502: in out-of-memory situation character is not restoredv8.0.1502
Problem: In out-of-memory situation character is not restored. (Coverity) Solution: Restore the character in all situations.
Diffstat (limited to 'src/ex_getln.c')
-rw-r--r--src/ex_getln.c25
1 files changed, 11 insertions, 14 deletions
diff --git a/src/ex_getln.c b/src/ex_getln.c
index a9d6bd483..f92f1dfed 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -5315,8 +5315,9 @@ ExpandUserDefined(
char_u *retstr;
char_u *s;
char_u *e;
- char_u keep;
+ int keep;
garray_T ga;
+ int skip;
retstr = call_user_expand_func(call_func_retstr, xp, num_file, file);
if (retstr == NULL)
@@ -5329,23 +5330,19 @@ ExpandUserDefined(
if (e == NULL)
e = s + STRLEN(s);
keep = *e;
- *e = 0;
+ *e = NUL;
- if (xp->xp_pattern[0] && vim_regexec(regmatch, s, (colnr_T)0) == 0)
+ skip = xp->xp_pattern[0] && vim_regexec(regmatch, s, (colnr_T)0) == 0;
+ *e = keep;
+
+ if (!skip)
{
- *e = keep;
- if (*e != NUL)
- ++e;
- continue;
+ if (ga_grow(&ga, 1) == FAIL)
+ break;
+ ((char_u **)ga.ga_data)[ga.ga_len] = vim_strnsave(s, (int)(e - s));
+ ++ga.ga_len;
}
- if (ga_grow(&ga, 1) == FAIL)
- break;
-
- ((char_u **)ga.ga_data)[ga.ga_len] = vim_strnsave(s, (int)(e - s));
- ++ga.ga_len;
-
- *e = keep;
if (*e != NUL)
++e;
}