diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2009-11-10 08:54:24 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2009-11-10 08:54:24 +0000 |
commit | 3aec0f00b186a669606767401892b9e9f8b1b84a (patch) | |
tree | ce66570d103f2d3e89953ad31c340b753f5096b9 /winsup/cygwin/path.cc | |
parent | 6e22c002ffec1f229d0a68625c33eebb7edcd514 (diff) | |
download | cygnal-3aec0f00b186a669606767401892b9e9f8b1b84a.tar.gz cygnal-3aec0f00b186a669606767401892b9e9f8b1b84a.tar.bz2 cygnal-3aec0f00b186a669606767401892b9e9f8b1b84a.zip |
* fhandler_disk_file.cc (is_volume_mountpoint): Align check with
symlink_info::check_reparse_point().
* path.cc (symlink_info::check_reparse_point): Rearrange slightly.
Add code path for unrecognized repare point types. Add comment.
Diffstat (limited to 'winsup/cygwin/path.cc')
-rw-r--r-- | winsup/cygwin/path.cc | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index daf780e84..6238f2bce 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -1844,6 +1844,7 @@ symlink_info::check_reparse_point (HANDLE h) NTSTATUS status; IO_STATUS_BLOCK io; PREPARSE_DATA_BUFFER rp = (PREPARSE_DATA_BUFFER) tp.c_get (); + UNICODE_STRING subst; char srcbuf[SYMLINK_MAX + 7]; status = NtFsControlFile (h, NULL, NULL, NULL, &io, FSCTL_GET_REPARSE_POINT, @@ -1857,18 +1858,12 @@ symlink_info::check_reparse_point (HANDLE h) return 0; } if (rp->ReparseTag == IO_REPARSE_TAG_SYMLINK) - { - sys_wcstombs (srcbuf, SYMLINK_MAX + 1, - (WCHAR *)((char *)rp->SymbolicLinkReparseBuffer.PathBuffer - + rp->SymbolicLinkReparseBuffer.SubstituteNameOffset), - rp->SymbolicLinkReparseBuffer.SubstituteNameLength / sizeof (WCHAR)); - pflags = PATH_SYMLINK | PATH_REP; - fileattr &= ~FILE_ATTRIBUTE_DIRECTORY; - } + RtlInitCountedUnicodeString (&subst, + (WCHAR *)((char *)rp->SymbolicLinkReparseBuffer.PathBuffer + + rp->SymbolicLinkReparseBuffer.SubstituteNameOffset), + rp->SymbolicLinkReparseBuffer.SubstituteNameLength); else if (rp->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT) { - UNICODE_STRING subst; - RtlInitCountedUnicodeString (&subst, (WCHAR *)((char *)rp->MountPointReparseBuffer.PathBuffer + rp->MountPointReparseBuffer.SubstituteNameOffset), @@ -1880,11 +1875,20 @@ symlink_info::check_reparse_point (HANDLE h) volume mount point. */ return -1; } - sys_wcstombs (srcbuf, SYMLINK_MAX + 1, subst.Buffer, - subst.Length / sizeof (WCHAR)); - pflags = PATH_SYMLINK | PATH_REP; - fileattr &= ~FILE_ATTRIBUTE_DIRECTORY; } + else + { + /* Maybe it's a reparse point, but it's certainly not one we + recognize. Drop the REPARSE file attribute so we don't even + try to use the flag for some special handling. It's just some + arbitrary file or directory for us. */ + fileattr &= ~FILE_ATTRIBUTE_REPARSE_POINT; + return 0; + } + sys_wcstombs (srcbuf, SYMLINK_MAX + 7, subst.Buffer, + subst.Length / sizeof (WCHAR)); + pflags = PATH_SYMLINK | PATH_REP; + fileattr &= ~FILE_ATTRIBUTE_DIRECTORY; return posixify (srcbuf); } |