diff options
-rw-r--r-- | winsup/cygwin/ChangeLog | 6 | ||||
-rw-r--r-- | winsup/cygwin/path.cc | 7 |
2 files changed, 13 insertions, 0 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index a4a66b310..95cf54512 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,5 +1,11 @@ 2010-02-06 Corinna Vinschen <corinna@vinschen.de> + * 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 <corinna@vinschen.de> + * sec_auth.cc (get_full_privileged_inheritable_token): New function to fetch token with full privileges from logon token in Vista and later, and to make token inheritable. Add lengthy comments to explain 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) |