Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2019-02-24 22:15:36 +0300
committerCorinna Vinschen <corinna@vinschen.de>2019-02-24 22:23:34 +0300
commita4e2eb6ba34b8cd3457e7f4074b1725874d6e2e9 (patch)
treedf5db03f3d97e1a0e57a88216a2c7683e444f1f9
parentaeaa051f3bd2dd74f664eeba87c9f2140e0b178e (diff)
Cygwin: timerfd: fix shared memory allocation in fork/exec
timerfd_tracker::fixup_after_fork_exec always tries to restore the shared timer region at the same address as in the parent. This is entirely unnecessary and wasn't intended, rather some kind of copy/paste thinko. Fix that. Print NtMapViewOfSection status code in api_fatal on failure for debugging. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r--winsup/cygwin/release/3.0.23
-rw-r--r--winsup/cygwin/timerfd.cc14
2 files changed, 11 insertions, 6 deletions
diff --git a/winsup/cygwin/release/3.0.2 b/winsup/cygwin/release/3.0.2
index c1a18a903..e24fe4e7c 100644
--- a/winsup/cygwin/release/3.0.2
+++ b/winsup/cygwin/release/3.0.2
@@ -12,6 +12,9 @@ Bug Fixes
- Fix timerfd select always returning immediately.
Addresses: https://cygwin.com/ml/cygwin/2019-02/msg00364.html
+- Fix fork/exec failing to restore timerfd share mem in child process.
+ Addresses: https://cygwin.com/ml/cygwin/2019-02/msg00400.html
+
- Drop enforcing case-correct group names for AD accounts to avoid
excessively long startup times.
Addresses: https://cygwin.com/ml/cygwin/2019-02/msg00301.html
diff --git a/winsup/cygwin/timerfd.cc b/winsup/cygwin/timerfd.cc
index 7e6be72b2..2823560e6 100644
--- a/winsup/cygwin/timerfd.cc
+++ b/winsup/cygwin/timerfd.cc
@@ -408,6 +408,7 @@ void
timerfd_tracker::fixup_after_fork_exec (bool execing)
{
NTSTATUS status;
+ PVOID base_address = NULL;
OBJECT_ATTRIBUTES attr;
SIZE_T vsize = PAGE_SIZE;
@@ -416,11 +417,12 @@ timerfd_tracker::fixup_after_fork_exec (bool execing)
return;
/* Recreate shared section mapping */
status = NtMapViewOfSection (tfd_shared_hdl, NtCurrentProcess (),
- (void **) &tfd_shared, 0, PAGE_SIZE, NULL,
- &vsize, ViewShare, MEM_TOP_DOWN, PAGE_READWRITE);
+ &base_address, 0, PAGE_SIZE, NULL,
+ &vsize, ViewShare, 0, PAGE_READWRITE);
if (!NT_SUCCESS (status))
- api_fatal ("Can't recreate shared timerfd section during %s!",
- execing ? "execve" : "fork");
+ api_fatal ("Can't recreate shared timerfd section during %s, status %y!",
+ execing ? "execve" : "fork", status);
+ tfd_shared = (timerfd_shared *) base_address;
/* Increment global instance count by the number of instances in this
process */
InterlockedAdd (&tfd_shared->instance_count, local_instance_count);
@@ -430,8 +432,8 @@ timerfd_tracker::fixup_after_fork_exec (bool execing)
status = NtCreateEvent (&cancel_evt, EVENT_ALL_ACCESS, &attr,
NotificationEvent, FALSE);
if (!NT_SUCCESS (status))
- api_fatal ("Can't recreate timerfd cancel event during %s!",
- execing ? "execve" : "fork");
+ api_fatal ("Can't recreate timerfd cancel event during %s, status %y!",
+ execing ? "execve" : "fork", status);
/* Set winpid so we don't run this twice */
winpid = GetCurrentProcessId ();
new cygthread (timerfd_thread, this, "timerfd", sync_thr);