Fix regression in uv_fs_poll_stop() (BZ 1703935)
Signed-off-by: Stephen Gallagher <sgallagh@redhat.com>
This commit is contained in:
parent
eb814ebd0e
commit
3ac5933d5f
114
2288.patch
Normal file
114
2288.patch
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
From 7a35cbab6847a9fd7decc3c47dcccdc22ef59408 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Anna Henningsen <anna@addaleax.net>
|
||||||
|
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)
|
||||||
|
|
@ -1,7 +1,7 @@
|
|||||||
Name: libuv
|
Name: libuv
|
||||||
Epoch: 1
|
Epoch: 1
|
||||||
Version: 1.28.0
|
Version: 1.28.0
|
||||||
Release: 1%{?dist}
|
Release: 2%{?dist}
|
||||||
Summary: Platform layer for node.js
|
Summary: Platform layer for node.js
|
||||||
|
|
||||||
# the licensing breakdown is described in detail in the LICENSE file
|
# the licensing breakdown is described in detail in the LICENSE file
|
||||||
@ -13,6 +13,9 @@ Source2: %{name}.pc.in
|
|||||||
BuildRequires: autoconf automake libtool
|
BuildRequires: autoconf automake libtool
|
||||||
BuildRequires: gcc
|
BuildRequires: gcc
|
||||||
|
|
||||||
|
# Upstream patch for BZ#1703935
|
||||||
|
Patch0001: 2288.patch
|
||||||
|
|
||||||
%description
|
%description
|
||||||
libuv is a new platform layer for Node. Its purpose is to abstract IOCP on
|
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
|
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
|
%{_libdir}/%{name}.a
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri May 03 2019 Stephen Gallagher <sgallagh@redhat.com> - 1.28.0-2
|
||||||
|
- Fix regression in uv_fs_poll_stop() (BZ 1703935)
|
||||||
|
|
||||||
* Tue Apr 23 2019 Stephen Gallagher <sgallagh@redhat.com> - 1.28.0-1
|
* Tue Apr 23 2019 Stephen Gallagher <sgallagh@redhat.com> - 1.28.0-1
|
||||||
- Update to libuv 1.28.0
|
- Update to libuv 1.28.0
|
||||||
- https://github.com/libuv/libuv/blob/v1.28.0/ChangeLog
|
- https://github.com/libuv/libuv/blob/v1.28.0/ChangeLog
|
||||||
|
Loading…
Reference in New Issue
Block a user