vim-patch:7.4.2139

Problem:    :delfunction causes illegal memory access.
Solution:   Correct logic when deciding to free a function.

0588d4f9d2
This commit is contained in:
Michael Ennen
2016-12-16 14:56:09 -07:00
parent 53fad45115
commit e71e9020eb
2 changed files with 5 additions and 4 deletions

View File

@@ -219,7 +219,7 @@ static int echo_attr = 0; /* attributes used for ":echo" */
#define FC_REMOVED 32 // function redefined while uf_refcount > 0 #define FC_REMOVED 32 // function redefined while uf_refcount > 0
// The names of packages that once were loaded are remembered. // The names of packages that once were loaded are remembered.
static garray_T ga_loaded = {0, 0, sizeof(char_u *), 4, NULL}; static garray_T ga_loaded = { 0, 0, sizeof(char_u *), 4, NULL };
// List heads for garbage collection. Although there can be a reference loop // List heads for garbage collection. Although there can be a reference loop
// from partial to dict to partial, we don't need to keep track of the partial, // from partial to dict to partial, we don't need to keep track of the partial,
@@ -20926,6 +20926,7 @@ void ex_function(exarg_T *eap)
int varargs = false; int varargs = false;
int flags = 0; int flags = 0;
ufunc_T *fp; ufunc_T *fp;
bool overwrite = false;
int indent; int indent;
int nesting; int nesting;
char_u *skip_until = NULL; char_u *skip_until = NULL;
@@ -21337,7 +21338,7 @@ void ex_function(exarg_T *eap)
} else { } else {
// redefine existing function // redefine existing function
ga_clear_strings(&(fp->uf_args)); ga_clear_strings(&(fp->uf_args));
ga_clear_strings(&(fp->uf_lines)) ga_clear_strings(&(fp->uf_lines));
xfree(name); xfree(name);
name = NULL; name = NULL;
} }
@@ -22156,7 +22157,7 @@ void ex_delfunction(exarg_T *eap)
// Numbered functions and lambdas snould be kept if the refcount is // Numbered functions and lambdas snould be kept if the refcount is
// one or more. // one or more.
if (fp->uf_refcount > (isdigit(fp->uf_name[0]) if (fp->uf_refcount > (isdigit(fp->uf_name[0])
|| fp->uf_name[0] == '<') ? 0 : 1) { || fp->uf_name[0] == '<' ? 0 : 1)) {
// Function is still referenced somewhere. Don't free it but // Function is still referenced somewhere. Don't free it but
// do remove it from the hashtable. // do remove it from the hashtable.
func_remove(fp); func_remove(fp);

View File

@@ -301,7 +301,7 @@ static int included_patches[] = {
// 2142, // 2142,
// 2141, // 2141,
// 2140 NA // 2140 NA
// 2139, 2139,
// 2138 NA // 2138 NA
2137, 2137,
2136, 2136,