From 3ac5933d5faa9944d9c5a69a7b14c73cf6072b03 Mon Sep 17 00:00:00 2001 From: Stephen Gallagher Date: Fri, 3 May 2019 12:42:57 -0400 Subject: [PATCH] Fix regression in uv_fs_poll_stop() (BZ 1703935) Signed-off-by: Stephen Gallagher --- 2288.patch | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++ libuv.spec | 8 +++- 2 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 2288.patch diff --git a/2288.patch b/2288.patch new file mode 100644 index 0000000..eccd400 --- /dev/null +++ b/2288.patch @@ -0,0 +1,114 @@ +From 7a35cbab6847a9fd7decc3c47dcccdc22ef59408 Mon Sep 17 00:00:00 2001 +From: Anna Henningsen +Date: Fri, 3 May 2019 18:33:13 +0200 +Subject: [PATCH] unix,win: fix `uv_fs_poll_stop()` when active +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Fix `uv_fs_poll_stop()` for active handles by not attempting to +mark the `uv_fs_poll_t` handle as closing when `uv_close()` +hasn’t been called on it. + +Fixes: https://github.com/libuv/libuv/issues/2287 +Refs: https://github.com/libuv/libuv/pull/1875 +--- + src/fs-poll.c | 2 +- + test/test-fs-poll.c | 39 +++++++++++++++++++++++++++++++++++++++ + test/test-list.h | 2 ++ + 3 files changed, 42 insertions(+), 1 deletion(-) + +diff --git a/src/fs-poll.c b/src/fs-poll.c +index 40cb147e8d..89864e23fb 100644 +--- a/src/fs-poll.c ++++ b/src/fs-poll.c +@@ -241,7 +241,7 @@ static void timer_close_cb(uv_handle_t* timer) { + handle = ctx->parent_handle; + if (ctx == handle->poll_ctx) { + handle->poll_ctx = ctx->previous; +- if (handle->poll_ctx == NULL) ++ if (handle->poll_ctx == NULL && uv__is_closing(handle)) + uv__make_close_pending((uv_handle_t*)handle); + } else { + for (last = handle->poll_ctx, it = last->previous; +diff --git a/test/test-fs-poll.c b/test/test-fs-poll.c +index e19a68780f..9dfd5fdd6a 100644 +--- a/test/test-fs-poll.c ++++ b/test/test-fs-poll.c +@@ -37,6 +37,10 @@ static void poll_cb_fail(uv_fs_poll_t* handle, + int status, + const uv_stat_t* prev, + const uv_stat_t* curr); ++static void poll_cb_noop(uv_fs_poll_t* handle, ++ int status, ++ const uv_stat_t* prev, ++ const uv_stat_t* curr); + + static uv_fs_poll_t poll_handle; + static uv_timer_t timer_handle; +@@ -84,6 +88,12 @@ static void poll_cb_fail(uv_fs_poll_t* handle, + ASSERT(0 && "fail_cb called"); + } + ++static void poll_cb_noop(uv_fs_poll_t* handle, ++ int status, ++ const uv_stat_t* prev, ++ const uv_stat_t* curr) { ++} ++ + + static void poll_cb(uv_fs_poll_t* handle, + int status, +@@ -259,3 +269,32 @@ TEST_IMPL(fs_poll_close_request_multi_stop_start) { + MAKE_VALGRIND_HAPPY(); + return 0; + } ++ ++TEST_IMPL(fs_poll_close_request_stop_when_active) { ++ /* Regression test for https://github.com/libuv/libuv/issues/2287. */ ++ uv_loop_t loop; ++ uv_fs_poll_t poll_handle; ++ ++ remove(FIXTURE); ++ ++ ASSERT(0 == uv_loop_init(&loop)); ++ ++ /* Set up all handles. */ ++ ASSERT(0 == uv_fs_poll_init(&loop, &poll_handle)); ++ ASSERT(0 == uv_fs_poll_start(&poll_handle, poll_cb_noop, FIXTURE, 100)); ++ uv_run(&loop, UV_RUN_ONCE); ++ ++ /* Close the timer handle, and do not crash. */ ++ ASSERT(0 == uv_fs_poll_stop(&poll_handle)); ++ uv_run(&loop, UV_RUN_ONCE); ++ ++ /* Clean up after the test. */ ++ uv_close((uv_handle_t*) &poll_handle, close_cb); ++ uv_run(&loop, UV_RUN_ONCE); ++ ASSERT(close_cb_called == 1); ++ ++ ASSERT(0 == uv_loop_close(&loop)); ++ ++ MAKE_VALGRIND_HAPPY(); ++ return 0; ++} +diff --git a/test/test-list.h b/test/test-list.h +index cf5420adfb..c090854bc5 100644 +--- a/test/test-list.h ++++ b/test/test-list.h +@@ -290,6 +290,7 @@ TEST_DECLARE (fs_poll_getpath) + TEST_DECLARE (fs_poll_close_request) + TEST_DECLARE (fs_poll_close_request_multi_start_stop) + TEST_DECLARE (fs_poll_close_request_multi_stop_start) ++TEST_DECLARE (fs_poll_close_request_stop_when_active) + TEST_DECLARE (kill) + TEST_DECLARE (kill_invalid_signum) + TEST_DECLARE (fs_file_noent) +@@ -844,6 +845,7 @@ TASK_LIST_START + TEST_ENTRY (fs_poll_close_request) + TEST_ENTRY (fs_poll_close_request_multi_start_stop) + TEST_ENTRY (fs_poll_close_request_multi_stop_start) ++ TEST_ENTRY (fs_poll_close_request_stop_when_active) + TEST_ENTRY (kill) + TEST_ENTRY (kill_invalid_signum) + diff --git a/libuv.spec b/libuv.spec index a8e68c5..f07bd17 100644 --- a/libuv.spec +++ b/libuv.spec @@ -1,7 +1,7 @@ Name: libuv Epoch: 1 Version: 1.28.0 -Release: 1%{?dist} +Release: 2%{?dist} Summary: Platform layer for node.js # the licensing breakdown is described in detail in the LICENSE file @@ -13,6 +13,9 @@ Source2: %{name}.pc.in BuildRequires: autoconf automake libtool BuildRequires: gcc +# Upstream patch for BZ#1703935 +Patch0001: 2288.patch + %description libuv is a new platform layer for Node. Its purpose is to abstract IOCP on Windows and libev on Unix systems. We intend to eventually contain all platform @@ -68,6 +71,9 @@ rm -f %{buildroot}%{_libdir}/libuv.la %{_libdir}/%{name}.a %changelog +* Fri May 03 2019 Stephen Gallagher - 1.28.0-2 +- Fix regression in uv_fs_poll_stop() (BZ 1703935) + * Tue Apr 23 2019 Stephen Gallagher - 1.28.0-1 - Update to libuv 1.28.0 - https://github.com/libuv/libuv/blob/v1.28.0/ChangeLog