summaryrefslogtreecommitdiffstats
path: root/src/autocmd.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-11-28 20:34:52 +0000
committerBram Moolenaar <Bram@vim.org>2022-11-28 20:34:52 +0000
commit84497cd06f06516f6ce727ea00c47792ce16dc70 (patch)
tree5cba204eafbd2506cc306d610f646f23d65a2d9b /src/autocmd.c
parentf86490ed4fdab213a28f667abd055c023a73d645 (diff)
patch 9.0.0967: leaking memory from autocmd windowsv9.0.0967
Problem: Leaking memory from autocmd windows. Solution: Free window when auc_win is not NULL.
Diffstat (limited to 'src/autocmd.c')
-rw-r--r--src/autocmd.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/src/autocmd.c b/src/autocmd.c
index 3a08128133..aca990cb51 100644
--- a/src/autocmd.c
+++ b/src/autocmd.c
@@ -653,12 +653,7 @@ free_all_autocmds(void)
}
ga_clear(&augroups);
- for (int i = 0; i < AUCMD_WIN_COUNT; ++i)
- if (aucmd_win[i].auc_win_used)
- {
- aucmd_win[i].auc_win_used = FALSE;
- win_remove(aucmd_win[i].auc_win, NULL);
- }
+ // aucmd_win[] is freed in win_free_all()
}
#endif
@@ -1553,12 +1548,11 @@ aucmd_prepbuf(
for (auc_idx = 0; auc_idx < AUCMD_WIN_COUNT; ++auc_idx)
if (!aucmd_win[auc_idx].auc_win_used)
{
- auc_win = win_alloc_popup_win();
+ if (aucmd_win[auc_idx].auc_win == NULL)
+ aucmd_win[auc_idx].auc_win = win_alloc_popup_win();
+ auc_win = aucmd_win[auc_idx].auc_win;
if (auc_win != NULL)
- {
- aucmd_win[auc_idx].auc_win = auc_win;
aucmd_win[auc_idx].auc_win_used = TRUE;
- }
break;
}
@@ -1667,6 +1661,9 @@ win_found:
// Remove the window and frame from the tree of frames.
(void)winframe_remove(curwin, &dummy, NULL);
win_remove(curwin, NULL);
+
+ // The window is marked as not used, but it is not freed, it can be
+ // used again.
aucmd_win[aco->use_aucmd_win_idx].auc_win_used = FALSE;
last_status(FALSE); // may need to remove last status line