diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2021-05-21 17:47:14 +0200 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2021-05-22 18:03:01 +0200 |
commit | 49b84cb264c3be68d8e15f8ccde28a92410a7c0c (patch) | |
tree | 589aa8d392045912a173311480d02c78c3b70860 | |
parent | a9c8050c363cfaa959004231adad8456b4df5c32 (diff) | |
download | newlib-49b84cb264c3be68d8e15f8ccde28a92410a7c0c.zip newlib-49b84cb264c3be68d8e15f8ccde28a92410a7c0c.tar.gz newlib-49b84cb264c3be68d8e15f8ccde28a92410a7c0c.tar.bz2 |
Cygwin: POSIX msg queues: improve error output in fixup_after_fork
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r-- | winsup/cygwin/fhandler_mqueue.cc | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/winsup/cygwin/fhandler_mqueue.cc b/winsup/cygwin/fhandler_mqueue.cc index 06ccf2f..6fc17c2 100644 --- a/winsup/cygwin/fhandler_mqueue.cc +++ b/winsup/cygwin/fhandler_mqueue.cc @@ -136,28 +136,35 @@ fhandler_mqueue::fixup_after_fork (HANDLE parent) SIZE_T filesize = mqinfo ()->mqi_sectsize; NTSTATUS status; - DuplicateHandle (parent, mqinfo ()->mqi_sect, - GetCurrentProcess (), &mqinfo ()->mqi_sect, - 0, FALSE, DUPLICATE_SAME_ACCESS); + if (!DuplicateHandle (parent, mqinfo ()->mqi_sect, + GetCurrentProcess (), &mqinfo ()->mqi_sect, + 0, FALSE, DUPLICATE_SAME_ACCESS)) + __leave; status = NtMapViewOfSection (mqinfo ()->mqi_sect, NtCurrentProcess (), &mptr, 0, filesize, NULL, &filesize, ViewShare, 0, PAGE_READWRITE); if (!NT_SUCCESS (status)) - api_fatal ("Mapping message queue failed in fork\n"); - else - mqinfo ()->mqi_hdr = (struct mq_hdr *) mptr; - DuplicateHandle (parent, mqinfo ()->mqi_waitsend, - GetCurrentProcess (), &mqinfo ()->mqi_waitsend, - 0, FALSE, DUPLICATE_SAME_ACCESS); - DuplicateHandle (parent, mqinfo ()->mqi_waitrecv, - GetCurrentProcess (), &mqinfo ()->mqi_waitrecv, - 0, FALSE, DUPLICATE_SAME_ACCESS); - DuplicateHandle (parent, mqinfo ()->mqi_lock, - GetCurrentProcess (), &mqinfo ()->mqi_lock, - 0, FALSE, DUPLICATE_SAME_ACCESS); + api_fatal ("Mapping message queue failed in fork, status 0x%x\n", + status); + + mqinfo ()->mqi_hdr = (struct mq_hdr *) mptr; + if (!DuplicateHandle (parent, mqinfo ()->mqi_waitsend, + GetCurrentProcess (), &mqinfo ()->mqi_waitsend, + 0, FALSE, DUPLICATE_SAME_ACCESS)) + __leave; + if (!DuplicateHandle (parent, mqinfo ()->mqi_waitrecv, + GetCurrentProcess (), &mqinfo ()->mqi_waitrecv, + 0, FALSE, DUPLICATE_SAME_ACCESS)) + __leave; + if (!DuplicateHandle (parent, mqinfo ()->mqi_lock, + GetCurrentProcess (), &mqinfo ()->mqi_lock, + 0, FALSE, DUPLICATE_SAME_ACCESS)) + __leave; + return; } __except (EFAULT) {} __endtry + api_fatal ("Creating IPC object failed in fork, %E"); } int |