mirror of
https://github.com/neovim/neovim.git
synced 2025-09-14 07:18:17 +00:00
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:
@@ -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);
|
||||||
|
@@ -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,
|
||||||
|
Reference in New Issue
Block a user