From 03d6e06edd0aaf2f591d74349cb25dbeca5895ef Mon Sep 17 00:00:00 2001 From: glepnir Date: Thu, 14 Aug 2025 21:15:44 +0200 Subject: [PATCH] patch 9.1.1632: memory leak in fuzzy.c Problem: memory leak in fuzzy.c Solution: Free fuzmatch, add a few minor refactors (glepnir) fixes neovim CID 584055: fuzmatch leak when count becomes 0 Fix partial allocation failure cleanup in buffer expansion closes: #17996 Signed-off-by: glepnir Signed-off-by: Christian Brabandt --- src/buffer.c | 4 ++++ src/fuzzy.c | 10 +++++----- src/version.c | 2 ++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/buffer.c b/src/buffer.c index 1ca561fce2..5937a9e12d 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -2971,7 +2971,11 @@ ExpandBufnames( else p = vim_strsave(p); if (p == NULL) + { + if (fuzzy && round == 2) + fuzmatch_str_free(fuzmatch, count); return FAIL; + } if (!fuzzy) { diff --git a/src/fuzzy.c b/src/fuzzy.c index c1b216ce59..47407644eb 100644 --- a/src/fuzzy.c +++ b/src/fuzzy.c @@ -868,11 +868,10 @@ search_for_fuzzy_match( void fuzmatch_str_free(fuzmatch_str_T *fuzmatch, int count) { - int i; - if (fuzmatch == NULL) return; - for (i = 0; i < count; ++i) + + for (int i = 0; i < count; ++i) vim_free(fuzmatch[i].str); vim_free(fuzmatch); } @@ -892,7 +891,7 @@ fuzzymatches_to_strmatches( int i; if (count <= 0) - return OK; + goto theend; *matches = ALLOC_MULT(char_u *, count); if (*matches == NULL) @@ -909,8 +908,9 @@ fuzzymatches_to_strmatches( for (i = 0; i < count; i++) (*matches)[i] = fuzmatch[i].str; - vim_free(fuzmatch); +theend: + vim_free(fuzmatch); return OK; } diff --git a/src/version.c b/src/version.c index 2f6fbeb82b..4f6c708431 100644 --- a/src/version.c +++ b/src/version.c @@ -719,6 +719,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1632, /**/ 1631, /**/