diff options
| author | Maxime Coste <mawww@kakoune.org> | 2025-06-03 09:26:15 +1000 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2025-06-03 09:26:15 +1000 |
| commit | c7a7c35963133c0d57dc2abe341dac6c7763b19c (patch) | |
| tree | e63dea1056c1bab318e8aacfa6e33f3b3cf3a6f4 /src/client.cc | |
| parent | ccb3090361103368ed57d628b5922e18a49fc604 (diff) | |
Prevent deletion of buffers while creating new windows
`kak -n -E 'hook global WinCreate .* %{ delete-buffer }'` was crashing
because we would delete the buffer during window construction, which
would not be able to delete the window as it was not fully constructed
and registered yet. This led to a window referencing a deleted buffer.
Fixing this by deleting the window later on failed because we can enter
an infinite loop where we constantly create a new *scratch* buffer, then
a window to display it, which deletes that buffer.
Make it an error to try to delete a buffer while a new window is
being setup by adding a Locked flag to buffers and checking that in
BufferManager::delete_buffer
Fixes #5311
Diffstat (limited to 'src/client.cc')
| -rw-r--r-- | src/client.cc | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/src/client.cc b/src/client.cc index da4ed9f0..2cb1c973 100644 --- a/src/client.cc +++ b/src/client.cc @@ -194,6 +194,9 @@ void Client::change_buffer(Buffer& buffer, Optional<FunctionRef<void()>> set_sel if (m_buffer_reload_dialog_opened) close_buffer_reload_dialog(); + buffer.flags() |= Buffer::Flags::Locked; + OnScopeEnd unlock{[&] { buffer.flags() &= ~Buffer::Flags::Locked; }}; + auto& client_manager = ClientManager::instance(); WindowAndSelections ws = client_manager.get_free_window(buffer); |
