ev: stop event listeners during context destroy
authorOlivier Basson <olivier@camtrace.com>
Wed, 29 Mar 2017 00:20:42 +0000 (08:20 +0800)
committerAndy Green <andy@warmcat.com>
Wed, 29 Mar 2017 00:22:19 +0000 (08:22 +0800)
commit73e12e7b9360c5ab1a7106b20358ee4ce403adc9
tree693d3675b5b9d655b2df207a89815882f4275f16
parent7a0dead82ae8036b6ad08717ca0b2fdb560e7fcc
ev: stop event listeners during context destroy

I think I've found a bug in libev backend, in function lws_libev_io(). I'm using latest version from master branch.

When deleting a context with active connections via lws_context_destroy(), context->being_destroyed is set to 1 early in the function, before the loop calling lws_close_free_wsi() on each active connection.
lws_close_free_wsi() calls remove_wsi_socket_from_fds(), which calls lws_libev_io(), and here is my problem :

lws_libev_io() returns without doing anything if context->being_destroyed is set, so libev callbacks for deleted connections file descriptors stay registered after context is destroyed, which may lead to segfault/undefined behaviour if these file descriptors get reused later (which would trigger the callbacks).

I think the "if (!pt->io_loop_ev || context->being_destroyed) return;" statement should be replaced with " if (!pt->io_loop_ev) return;"

This fixes the problem for me and I have not seen any side effect yet. Moreover, libuv backend does not have such a test.
lib/libev.c