From 38d9821daf5c631d2c8f12bc772961973edaba0c Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Sat, 6 Feb 2010 15:57:21 +0000 Subject: [PATCH] * path.cc (symlink_info::check_nfs_symlink): Reopen file with FILE_READ_EA access since, surprisingly, you need it to read EAs even on NFS. --- winsup/cygwin/ChangeLog | 6 ++++++ winsup/cygwin/path.cc | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index a4a66b310..95cf54512 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,9 @@ +2010-02-06 Corinna Vinschen + + * path.cc (symlink_info::check_nfs_symlink): Reopen file with + FILE_READ_EA access since, surprisingly, you need it to read EAs even + on NFS. + 2010-02-06 Corinna Vinschen * sec_auth.cc (get_full_privileged_inheritable_token): New function diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 77a7034f8..f1e203047 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -1884,6 +1884,7 @@ symlink_info::check_nfs_symlink (HANDLE h) { tmp_pathbuf tp; NTSTATUS status; + OBJECT_ATTRIBUTES attr; IO_STATUS_BLOCK io; struct { FILE_GET_EA_INFORMATION fgei; @@ -1892,6 +1893,11 @@ symlink_info::check_nfs_symlink (HANDLE h) PFILE_FULL_EA_INFORMATION pffei; int res = 0; + InitializeObjectAttributes (&attr, &ro_u_empty, 0, h, NULL); + status = NtOpenFile (&h, FILE_READ_EA, &attr, &io, FILE_SHARE_VALID_FLAGS, + FILE_OPEN_REPARSE_POINT | FILE_OPEN_FOR_BACKUP_INTENT); + if (!NT_SUCCESS (status)) + return 0; /* To find out if the file is a symlink and to get the symlink target, try to fetch the NfsSymlinkTargetName EA. */ fgei_buf.fgei.NextEntryOffset = 0; @@ -1900,6 +1906,7 @@ symlink_info::check_nfs_symlink (HANDLE h) pffei = (PFILE_FULL_EA_INFORMATION) tp.w_get (); status = NtQueryEaFile (h, &io, pffei, NT_MAX_PATH * sizeof (WCHAR), TRUE, &fgei_buf.fgei, sizeof fgei_buf, NULL, TRUE); + NtClose (h); if (NT_SUCCESS (status) && pffei->EaValueLength > 0) { PWCHAR spath = (PWCHAR)