aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2015-09-16 02:48:10 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2015-09-16 02:52:55 -0300
commit22ea2900d0eeca0f3cdc4ee5dbfce66966d1a661 (patch)
tree8cb320d319884621dce679b3ec8087f2d00db9db
parent5613b62224e4cf8a0088537c7f4ea883530e3cf8 (diff)
downloadrneovim-22ea2900d0eeca0f3cdc4ee5dbfce66966d1a661.tar.gz
rneovim-22ea2900d0eeca0f3cdc4ee5dbfce66966d1a661.tar.bz2
rneovim-22ea2900d0eeca0f3cdc4ee5dbfce66966d1a661.zip
loop: Free the parent queue last when destroying the loop
This avoids a heap-use-after-free ASAN error. Close #3334
-rw-r--r--src/nvim/event/loop.c2
-rw-r--r--test/functional/ex_cmds/quit_spec.lua14
2 files changed, 15 insertions, 1 deletions
diff --git a/src/nvim/event/loop.c b/src/nvim/event/loop.c
index 088e059d19..6f3e6b9253 100644
--- a/src/nvim/event/loop.c
+++ b/src/nvim/event/loop.c
@@ -86,9 +86,9 @@ void loop_close(Loop *loop)
do {
uv_run(&loop->uv, UV_RUN_DEFAULT);
} while (uv_loop_close(&loop->uv));
- queue_free(loop->events);
queue_free(loop->fast_events);
queue_free(loop->thread_events);
+ queue_free(loop->events);
kl_destroy(WatcherPtr, loop->children);
}
diff --git a/test/functional/ex_cmds/quit_spec.lua b/test/functional/ex_cmds/quit_spec.lua
new file mode 100644
index 0000000000..3cd8e19617
--- /dev/null
+++ b/test/functional/ex_cmds/quit_spec.lua
@@ -0,0 +1,14 @@
+local helpers = require('test.functional.helpers')
+local execute, eq, clear = helpers.execute, helpers.eq, helpers.clear
+
+describe(':qa', function()
+ before_each(function()
+ clear('qa')
+ end)
+
+ it('verify #3334', function()
+ -- just testing if 'qa' passed as a program argument wont result in memory
+ -- errors
+ end)
+end)
+