summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2010-02-06 15:57:21 +0000
committerCorinna Vinschen <corinna@vinschen.de>2010-02-06 15:57:21 +0000
commit38d9821daf5c631d2c8f12bc772961973edaba0c (patch)
tree0452cb9f960bf6686051aec6a876c0f0426a0080
parentb96600ef91059d539260c1b223c80c02072bf84d (diff)
downloadcygnal-38d9821daf5c631d2c8f12bc772961973edaba0c.tar.gz
cygnal-38d9821daf5c631d2c8f12bc772961973edaba0c.tar.bz2
cygnal-38d9821daf5c631d2c8f12bc772961973edaba0c.zip
* 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.
-rw-r--r--winsup/cygwin/ChangeLog6
-rw-r--r--winsup/cygwin/path.cc7
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)