public inbox for cygwin-cvs@sourceware.org
help / color / mirror / Atom feed
From: Corinna Vinschen <corinna@sourceware.org>
To: cygwin-cvs@sourceware.org
Subject: [newlib-cygwin/main] Cygwin: cwd: avoid releasing the cwdstuff SRW Lock twice
Date: Tue, 31 Oct 2023 10:27:12 +0000 (GMT)	[thread overview]
Message-ID: <20231031102712.4EC2C385841F@sourceware.org> (raw)

https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=60d1eeac6c6185ac77b181929c773015a2772fe8

commit 60d1eeac6c6185ac77b181929c773015a2772fe8
Author:     Corinna Vinschen <corinna@vinschen.de>
AuthorDate: Mon Oct 30 19:40:31 2023 +0100
Commit:     Corinna Vinschen <corinna@vinschen.de>
CommitDate: Mon Oct 30 19:40:31 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 1c3583d763a9..c3f84f7f8071 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -4868,10 +4868,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

                 reply	other threads:[~2023-10-31 10:27 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20231031102712.4EC2C385841F@sourceware.org \
    --to=corinna@sourceware.org \
    --cc=cygwin-cvs@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).