diff options
author | Bram Moolenaar <Bram@vim.org> | 2022-11-28 20:34:52 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-11-28 20:34:52 +0000 |
commit | 84497cd06f06516f6ce727ea00c47792ce16dc70 (patch) | |
tree | 5cba204eafbd2506cc306d610f646f23d65a2d9b /src/autocmd.c | |
parent | f86490ed4fdab213a28f667abd055c023a73d645 (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.c | 17 |
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 |