mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-01-18 12:29:32 +08:00
* path.cc (symlink_info::check_reparse_point): Always check
SubstituteName for volume string to recognize volume mount points. Reuse subst when calling sys_wcstombs. * syscalls.cc (rename): Set errno to EBUSY when trying to rename volume mount points. Explain why.
This commit is contained in:
parent
ed66791aba
commit
16a72f7e4b
@ -1,3 +1,11 @@
|
||||
2009-11-09 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
* path.cc (symlink_info::check_reparse_point): Always check
|
||||
SubstituteName for volume string to recognize volume mount points.
|
||||
Reuse subst when calling sys_wcstombs.
|
||||
* syscalls.cc (rename): Set errno to EBUSY when trying to rename
|
||||
volume mount points. Explain why.
|
||||
|
||||
2009-11-09 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
* fhandler_console.cc (fhandler_console::read): Restrict generating
|
||||
|
@ -1873,18 +1873,15 @@ symlink_info::check_reparse_point (HANDLE h)
|
||||
(WCHAR *)((char *)rp->MountPointReparseBuffer.PathBuffer
|
||||
+ rp->MountPointReparseBuffer.SubstituteNameOffset),
|
||||
rp->MountPointReparseBuffer.SubstituteNameLength);
|
||||
if (rp->MountPointReparseBuffer.PrintNameLength == 0
|
||||
|| RtlEqualUnicodePathPrefix (&subst, &ro_u_volume, TRUE))
|
||||
if (RtlEqualUnicodePathPrefix (&subst, &ro_u_volume, TRUE))
|
||||
{
|
||||
/* Volume mount point. Not treated as symlink. The return
|
||||
value of -1 is a hint for the caller to treat this as a
|
||||
volume mount point. */
|
||||
return -1;
|
||||
}
|
||||
sys_wcstombs (srcbuf, SYMLINK_MAX + 1,
|
||||
(WCHAR *)((char *)rp->MountPointReparseBuffer.PathBuffer
|
||||
+ rp->MountPointReparseBuffer.SubstituteNameOffset),
|
||||
rp->MountPointReparseBuffer.SubstituteNameLength / sizeof (WCHAR));
|
||||
sys_wcstombs (srcbuf, SYMLINK_MAX + 1, subst.Buffer,
|
||||
subst.Length / sizeof (WCHAR));
|
||||
pflags = PATH_SYMLINK | PATH_REP;
|
||||
fileattr &= ~FILE_ATTRIBUTE_DIRECTORY;
|
||||
}
|
||||
|
@ -1758,6 +1758,16 @@ rename (const char *oldpath, const char *newpath)
|
||||
set_errno (EROFS);
|
||||
goto out;
|
||||
}
|
||||
if (oldpc.has_attribute (FILE_ATTRIBUTE_REPARSE_POINT) && !oldpc.issymlink ())
|
||||
{
|
||||
/* Volume mount point. If we try to rename a volume mount point, NT
|
||||
returns STATUS_NOT_SAME_DEVICE ==> Win32 ERROR_NOT_SAME_DEVICE ==>
|
||||
errno EXDEV. That's bad since mv(1) will now perform a cross-device
|
||||
move. So what we do here is to treat the volume mount point just
|
||||
like Linux treats a mount point. */
|
||||
set_errno (EBUSY);
|
||||
goto out;
|
||||
}
|
||||
if (old_dir_requested && !oldpc.isdir ())
|
||||
{
|
||||
/* Reject rename("file/","x"). */
|
||||
|
Loading…
x
Reference in New Issue
Block a user