* security.cc (set_nt_attribute): Return always -1 in case of
a failure. * times.cc (utimes): On NTFS with ntsec ON, change the file's security descriptor temporarily to acquire write access if opening the file failed.
This commit is contained in:
parent
5fd12fb0cc
commit
2a9366ff49
|
@ -1,3 +1,11 @@
|
||||||
|
Wed Aug 15 12:18:00 2001 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* security.cc (set_nt_attribute): Return always -1 in case of
|
||||||
|
a failure.
|
||||||
|
* times.cc (utimes): On NTFS with ntsec ON, change the file's
|
||||||
|
security descriptor temporarily to acquire write access if
|
||||||
|
opening the file failed.
|
||||||
|
|
||||||
Wed Aug 15 9:42:00 2001 Corinna Vinschen <corinna@vinschen.de>
|
Wed Aug 15 9:42:00 2001 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* fhandler.cc (fhandler_base::is_nonblocking): New method.
|
* fhandler.cc (fhandler_base::is_nonblocking): New method.
|
||||||
|
|
|
@ -1570,7 +1570,7 @@ set_nt_attribute (const char *file, uid_t uid, gid_t gid,
|
||||||
if ((ret = read_sd (file, psd, &sd_size)) <= 0)
|
if ((ret = read_sd (file, psd, &sd_size)) <= 0)
|
||||||
{
|
{
|
||||||
debug_printf ("read_sd %E");
|
debug_printf ("read_sd %E");
|
||||||
return ret;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
sd_size = 4096;
|
sd_size = 4096;
|
||||||
|
|
|
@ -449,6 +449,8 @@ utimes (const char *path, struct timeval *tvp)
|
||||||
int res = 0;
|
int res = 0;
|
||||||
struct timeval tmp[2];
|
struct timeval tmp[2];
|
||||||
path_conv win32 (path);
|
path_conv win32 (path);
|
||||||
|
PSECURITY_DESCRIPTOR sd = NULL;
|
||||||
|
DWORD sd_size;
|
||||||
|
|
||||||
if (win32.error)
|
if (win32.error)
|
||||||
{
|
{
|
||||||
|
@ -475,13 +477,38 @@ utimes (const char *path, struct timeval *tvp)
|
||||||
/* What we can do with directories more? */
|
/* What we can do with directories more? */
|
||||||
res = 0;
|
res = 0;
|
||||||
}
|
}
|
||||||
|
else if (allow_ntsec && win32.has_acls ())
|
||||||
|
{
|
||||||
|
/* The following hack allows setting the correct filetime
|
||||||
|
on NTFS with ntsec ON even when the file is R/O for the
|
||||||
|
current user. This solves the `cp -p' problem and allows
|
||||||
|
a more UNIX like behaviour. Basically we save the file's
|
||||||
|
current security descriptor, change the file access so
|
||||||
|
that we have write access (if possible) and if that worked
|
||||||
|
fine, reset the old security descriptor at the end of the
|
||||||
|
function. */
|
||||||
|
sd_size = 4096;
|
||||||
|
sd = (PSECURITY_DESCRIPTOR) alloca (sd_size);
|
||||||
|
if (read_sd (win32.get_win32 (), sd, &sd_size) <= 0)
|
||||||
|
sd = NULL;
|
||||||
|
else if (set_file_attribute (TRUE, win32.get_win32 (), 0600))
|
||||||
|
sd = NULL;
|
||||||
|
else
|
||||||
|
h = CreateFileA (win32.get_win32 (),
|
||||||
|
GENERIC_WRITE,
|
||||||
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||||
|
&sec_none_nih,
|
||||||
|
OPEN_EXISTING,
|
||||||
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS,
|
||||||
|
0);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
res = -1;
|
res = -1;
|
||||||
__seterrno ();
|
__seterrno ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
if (h != INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
if (tvp == 0)
|
if (tvp == 0)
|
||||||
{
|
{
|
||||||
|
@ -517,6 +544,9 @@ utimes (const char *path, struct timeval *tvp)
|
||||||
CloseHandle (h);
|
CloseHandle (h);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sd)
|
||||||
|
write_sd (win32.get_win32 (), sd, sd_size);
|
||||||
|
|
||||||
syscall_printf ("%d = utimes (%s, %x); (h%d)",
|
syscall_printf ("%d = utimes (%s, %x); (h%d)",
|
||||||
res, path, tvp, h);
|
res, path, tvp, h);
|
||||||
return res;
|
return res;
|
||||||
|
|
Loading…
Reference in New Issue