diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-12-19 16:49:27 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-12-19 16:49:27 +0000 |
commit | 33e543038b84af7557ab9ecff500fc4ab98dd2a3 (patch) | |
tree | f5c5f4defc5032685baf35de460e93963f834b8d | |
parent | 07146ad1d33ba0d36b324873e5c461931e6b025e (diff) | |
download | vim-git-33e543038b84af7557ab9ecff500fc4ab98dd2a3.tar.gz |
patch 9.0.1079: leaking memory when defining a user command failsv9.0.1079
Problem: Leaking memory when defining a user command fails.
Solution: Free "compl_arg" when needed. (closes #11726)
-rw-r--r-- | src/testdir/test_usercommands.vim | 5 | ||||
-rw-r--r-- | src/usercmd.c | 15 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 20 insertions, 2 deletions
diff --git a/src/testdir/test_usercommands.vim b/src/testdir/test_usercommands.vim index 57953ced8..d8b4cb40e 100644 --- a/src/testdir/test_usercommands.vim +++ b/src/testdir/test_usercommands.vim @@ -342,6 +342,11 @@ func Test_CmdErrors() call assert_fails('com DoCmd :', 'E174:') comclear call assert_fails('delcom DoCmd', 'E184:') + + " These used to leak memory + call assert_fails('com! -complete=custom,CustomComplete _ :', 'E182:') + call assert_fails('com! -complete=custom,CustomComplete docmd :', 'E183:') + call assert_fails('com! -complete=custom,CustomComplete -xxx DoCmd :', 'E181:') endfunc func CustomComplete(A, L, P) diff --git a/src/usercmd.c b/src/usercmd.c index d8783321d..3bd6fd536 100644 --- a/src/usercmd.c +++ b/src/usercmd.c @@ -1167,7 +1167,7 @@ ex_command(exarg_T *eap) end = skiptowhite(p); if (uc_scan_attr(p, end - p, &argt, &def, &flags, &compl, &compl_arg, &addr_type_arg) == FAIL) - return; + goto theend; p = skipwhite(end); } @@ -1179,7 +1179,7 @@ ex_command(exarg_T *eap) if (!ends_excmd2(eap->arg, p) && !VIM_ISWHITE(*p)) { emsg(_(e_invalid_command_name)); - return; + goto theend; } end = p; name_len = (int)(end - name); @@ -1188,13 +1188,19 @@ ex_command(exarg_T *eap) // we are listing commands p = skipwhite(end); if (!has_attr && ends_excmd2(eap->arg, p)) + { uc_list(name, end - name); + } else if (!ASCII_ISUPPER(*name)) + { emsg(_(e_user_defined_commands_must_start_with_an_uppercase_letter)); + } else if ((name_len == 1 && *name == 'X') || (name_len <= 4 && STRNCMP(name, "Next", name_len > 4 ? 4 : name_len) == 0)) + { emsg(_(e_reserved_name_cannot_be_used_for_user_defined_command)); + } else if (compl > 0 && (argt & EX_EXTRA) == 0) { // Some plugins rely on silently ignoring the mistake, only make this @@ -1215,7 +1221,12 @@ ex_command(exarg_T *eap) uc_add_command(name, end - name, p, argt, def, flags, compl, compl_arg, addr_type_arg, eap->forceit); vim_free(tofree); + + return; // success } + +theend: + vim_free(compl_arg); } /* diff --git a/src/version.c b/src/version.c index 1ce404295..401d78bd3 100644 --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1079, +/**/ 1078, /**/ 1077, |