public inbox for cygwin-cvs@sourceware.org
help / color / mirror / Atom feed
* [newlib-cygwin/cygwin-3_4-branch] Cygwin: cwd: avoid releasing the cwdstuff SRW Lock twice
@ 2023-10-31 10:27 Corinna Vinschen
0 siblings, 0 replies; only message in thread
From: Corinna Vinschen @ 2023-10-31 10:27 UTC (permalink / raw)
To: cygwin-cvs
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=f0c90d3a8aa4409608abe76e035eab5919133a61
commit f0c90d3a8aa4409608abe76e035eab5919133a61
Author: Corinna Vinschen <corinna@vinschen.de>
AuthorDate: Mon Oct 30 19:40:31 2023 +0100
Commit: Corinna Vinschen <corinna@vinschen.de>
CommitDate: Tue Oct 31 10:52:02 2023 +0100
Cygwin: cwd: avoid releasing the cwdstuff SRW Lock twice
cwdstuff::set has a code snippet handling the case where a process
can't create a handle to a directory, e. g., due to permissions.
Commit 88443b0a22589 ("cwdstuff: Don't leave from setting the CWD
prematurely on init") introduced a special case to handle this
situation at process initialization. It also introduces an early
mutex release, which is not required, but ok, because we're in the
init phase. Releasing the mutex twice is no problem since the mutexes
are recursive.
Fast forward to commit 0819679a7a210 ("Cygwin: cwd: use SRWLOCK
instead of muto"). The mechanical change from a recursive mutex
to a non-recursive SRWLOCK failed to notice that this very specific
situation will release the SRWLOCK twice.
Remove the superfluous release action. While at it, don't set dir to
NULL, but h, since dir will get the value of h anyway later on.
Setting h to NULL may not be necessary, but better safe than sorry.
Reported-by: tryandbuy >tryandbuy@proton.me>
Fixes: 88443b0a22589 ("cwdstuff: Don't leave from setting the CWD prematurely on init")
Fixes: 0819679a7a210 ("Cygwin: cwd: use SRWLOCK instead of muto")
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diff:
---
winsup/cygwin/path.cc | 3 +--
winsup/cygwin/release/3.4.10 | 3 +++
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index e788c7d60e03..5ad9e201f74e 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -4942,10 +4942,9 @@ cwdstuff::set (path_conv *nat_cwd, const char *posix_cwd)
peb.ProcessParameters->CurrentDirectoryHandle,
GetCurrentProcess (), &h, 0, TRUE, 0))
{
- release_write ();
if (peb.ProcessParameters->CurrentDirectoryHandle)
debug_printf ("...and DuplicateHandle failed with %E.");
- dir = NULL;
+ h = NULL;
}
}
}
diff --git a/winsup/cygwin/release/3.4.10 b/winsup/cygwin/release/3.4.10
index f34b131b32ae..c75283991461 100644
--- a/winsup/cygwin/release/3.4.10
+++ b/winsup/cygwin/release/3.4.10
@@ -3,3 +3,6 @@ Bug Fixes
- Fix missing term in __cpuset_zero_s() prototoype in sys/cpuset.h.
Addresses: https://cygwin.com/pipermail/cygwin/2023-September/254423.html
+
+- Fix hang in process initialization if cwd is unreadable.
+ Addresses: https://cygwin.com/pipermail/cygwin/2023-October/254604.html
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2023-10-31 10:27 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-10-31 10:27 [newlib-cygwin/cygwin-3_4-branch] Cygwin: cwd: avoid releasing the cwdstuff SRW Lock twice Corinna Vinschen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).