From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2155) id 4EC2C385841F; Tue, 31 Oct 2023 10:27:12 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4EC2C385841F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1698748032; bh=a1JO5nWBkgWtlM0pGYEmOrXrFpLisacagToNa728ALY=; h=From:To:Subject:Date:From; b=vysqm0LYcILRHW1ICEKeuVbOoBDUtEt1GBf0a9nKtveG4nu+TRDkGyPB3aGf75xzs nVW7mCt2Ju+KOiAc6T49DPhEbQwoSyfqKbdd8W98P5yelsU26PddHE7rOCN1nw539o M4owMvYkkskC4e+n91ea6LGChXSm9/U6889EQKrI= Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Corinna Vinschen To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin/main] Cygwin: cwd: avoid releasing the cwdstuff SRW Lock twice X-Act-Checkin: newlib-cygwin X-Git-Author: Corinna Vinschen X-Git-Refname: refs/heads/main X-Git-Oldrev: d56d58ace27b00e6b11f25d8a02b6deab3db272b X-Git-Newrev: 60d1eeac6c6185ac77b181929c773015a2772fe8 Message-Id: <20231031102712.4EC2C385841F@sourceware.org> Date: Tue, 31 Oct 2023 10:27:12 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=3Dnewlib-cygwin.git;h=3D60d1eeac6c6= 185ac77b181929c773015a2772fe8 commit 60d1eeac6c6185ac77b181929c773015a2772fe8 Author: Corinna Vinschen AuthorDate: Mon Oct 30 19:40:31 2023 +0100 Commit: Corinna Vinschen CommitDate: Mon Oct 30 19:40:31 2023 +0100 Cygwin: cwd: avoid releasing the cwdstuff SRW Lock twice =20 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. =20 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. =20 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. =20 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. =20 Reported-by: tryandbuy >tryandbuy@proton.me> Fixes: 88443b0a22589 ("cwdstuff: Don't leave from setting the CWD prema= turely on init") Fixes: 0819679a7a210 ("Cygwin: cwd: use SRWLOCK instead of muto") Signed-off-by: Corinna Vinschen 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 =3D NULL; + h =3D 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 =20 - 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