From 22d9ffa63ac22d3823c41b4671e0565a92cf8619 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Fri, 22 Nov 2019 20:29:55 +1100 Subject: [PATCH] Fix crash when deleting buffers in a BufClose hook --- src/buffer_manager.cc | 7 ++++--- test/regression/0-crash-on-delete-buffer-BufClose/cmd | 1 + test/regression/0-crash-on-delete-buffer-BufClose/in | 1 + test/regression/0-crash-on-delete-buffer-BufClose/rc | 7 +++++++ 4 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 test/regression/0-crash-on-delete-buffer-BufClose/cmd create mode 100644 test/regression/0-crash-on-delete-buffer-BufClose/in create mode 100644 test/regression/0-crash-on-delete-buffer-BufClose/rc diff --git a/src/buffer_manager.cc b/src/buffer_manager.cc index 30056525..d8d4da26 100644 --- a/src/buffer_manager.cc +++ b/src/buffer_manager.cc @@ -48,15 +48,16 @@ Buffer* BufferManager::create_buffer(String name, Buffer::Flags flags, void BufferManager::delete_buffer(Buffer& buffer) { auto it = find_if(m_buffers, [&](auto& p) { return p.get() == &buffer; }); - kak_assert(it != m_buffers.end()); - - buffer.on_unregistered(); + if (it == m_buffers.end()) // we might be trying to recursively delete this buffer + return; m_buffer_trash.emplace_back(std::move(*it)); m_buffers.erase(it); if (ClientManager::has_instance()) ClientManager::instance().ensure_no_client_uses_buffer(buffer); + + buffer.on_unregistered(); } Buffer* BufferManager::get_buffer_ifp(StringView name) diff --git a/test/regression/0-crash-on-delete-buffer-BufClose/cmd b/test/regression/0-crash-on-delete-buffer-BufClose/cmd new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/test/regression/0-crash-on-delete-buffer-BufClose/cmd @@ -0,0 +1 @@ + diff --git a/test/regression/0-crash-on-delete-buffer-BufClose/in b/test/regression/0-crash-on-delete-buffer-BufClose/in new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/test/regression/0-crash-on-delete-buffer-BufClose/in @@ -0,0 +1 @@ + diff --git a/test/regression/0-crash-on-delete-buffer-BufClose/rc b/test/regression/0-crash-on-delete-buffer-BufClose/rc new file mode 100644 index 00000000..ff8472dc --- /dev/null +++ b/test/regression/0-crash-on-delete-buffer-BufClose/rc @@ -0,0 +1,7 @@ +edit -scratch buf1 +edit -scratch buf2 +hook buffer BufClose buf2 %{ + delete-buffer + delete-buffer buf1 +} +delete-buffer