From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2155) id 06E253857C48; Fri, 19 Feb 2021 18:21:33 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 06E253857C48 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Corinna Vinschen To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin] Cygwin: realpath: fix cygwin installation dir being access via junction X-Act-Checkin: newlib-cygwin X-Git-Author: Corinna Vinschen X-Git-Refname: refs/heads/master X-Git-Oldrev: 543e39bb129ac77e29e3800a468100a754ad3d2a X-Git-Newrev: 6d898f43fc87a7bf3ab100d75538e381bd86f657 Message-Id: <20210219182133.06E253857C48@sourceware.org> Date: Fri, 19 Feb 2021 18:21:33 +0000 (GMT) X-BeenThere: cygwin-cvs@cygwin.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Cygwin core component git logs List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 19 Feb 2021 18:21:33 -0000 https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=6d898f43fc87a7bf3ab100d75538e381bd86f657 commit 6d898f43fc87a7bf3ab100d75538e381bd86f657 Author: Corinna Vinschen Date: Fri Feb 19 18:15:58 2021 +0100 Cygwin: realpath: fix cygwin installation dir being access via junction Consider this case: - Cygwin installed in C:\cygwin64 - mklink /j D:\cygwin64 C:\cygwin64 - create testcase calling realpath("/", result); printf ("%s\n", result); - start cmd >C:\cygwin64\bin\bash -lc / >D\cygwin64\bin\bash -lc /cygdrive/c/cygwin64 This scenario circumventing the mount point handling which is automated in terms of /, depending on the path returned from GetModuleFileNameW for the Cygwin DLL. When calling D:\cygwin64\bin\bash the dir returned from GetModuleFileNameW is D:\cygwin64\bin, thus root is D:\cygwin64. However, junctions are treated as symlinks in Cygwin which explains why the path gets converted to a cygdrive path. Fix this by calling GetFinalPathNameByHandleW on the result from GetModuleFileNameW to get the correct root path, even if accessed via a junction point. Signed-off-by: Corinna Vinschen Diff: --- winsup/cygwin/cygheap.cc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/winsup/cygwin/cygheap.cc b/winsup/cygwin/cygheap.cc index 3a32c352d..01b49468e 100644 --- a/winsup/cygwin/cygheap.cc +++ b/winsup/cygwin/cygheap.cc @@ -144,6 +144,19 @@ init_cygheap::init_installation_root () api_fatal ("Can't initialize Cygwin installation root dir.\n" "GetModuleFileNameW(%p, %p, %u), %E", cygwin_hmodule, installation_root_buf, PATH_MAX); + + /* We don't care if fetching the final pathname fails, it's non-fatal and + the path returned by GetModuleFileNameW is still valid. */ + HANDLE h; + h = CreateFileW (installation_root_buf, GENERIC_READ, FILE_SHARE_VALID_FLAGS, + &sec_none, OPEN_EXISTING, 0, 0); + if (h != INVALID_HANDLE_VALUE) + { + GetFinalPathNameByHandleW (h, installation_root_buf, PATH_MAX, + FILE_NAME_NORMALIZED); + CloseHandle (h); + } + PWCHAR p = installation_root_buf; if (wcsncasecmp (p, L"\\\\", 2)) /* Normal drive letter path */ {