Commit 84e5ed96 authored by Eli Zaretskii's avatar Eli Zaretskii
Browse files

Another minor fix in acl_set_file on Windows.

 src/w32.c (acl_set_file): Don't test for errors unless
 set_file_security returns FALSE.  Avoids spurious errors when
 saving files.
parent 2ef88fd4
2013-01-21 Eli Zaretskii <eliz@gnu.org>
* w32.c (acl_set_file): Don't test for errors unless
set_file_security returns FALSE. Avoids spurious errors when
saving files.
2013-01-21 Dmitry Antipov <dmantipov@yandex.ru> 2013-01-21 Dmitry Antipov <dmantipov@yandex.ru>
   
* fileio.c (Finsert_file_contents): Revert code introduced at * fileio.c (Finsert_file_contents): Revert code introduced at
......
...@@ -4868,51 +4868,57 @@ acl_set_file (const char *fname, acl_type_t type, acl_t acl) ...@@ -4868,51 +4868,57 @@ acl_set_file (const char *fname, acl_type_t type, acl_t acl)
e = errno; e = errno;
errno = 0; errno = 0;
set_file_security ((char *)fname, flags, (PSECURITY_DESCRIPTOR)acl); if (!set_file_security ((char *)fname, flags, (PSECURITY_DESCRIPTOR)acl))
err = GetLastError ();
if (st)
{ {
if (st >= 2) err = GetLastError ();
restore_privilege (&old2);
restore_privilege (&old1);
revert_to_self ();
}
if (errno == ENOTSUP)
;
else if (err == ERROR_SUCCESS)
{
retval = 0;
errno = e;
}
else if (err == ERROR_INVALID_OWNER || err == ERROR_NOT_ALL_ASSIGNED
|| err == ERROR_ACCESS_DENIED)
{
/* Maybe the requested ACL and the one the file already has are
identical, in which case we can silently ignore the
failure. (And no, Windows doesn't.) */
acl_t current_acl = acl_get_file (fname, ACL_TYPE_ACCESS);
errno = EPERM; if (errno == ENOTSUP)
if (current_acl) ;
else if (err == ERROR_INVALID_OWNER
|| err == ERROR_NOT_ALL_ASSIGNED
|| err == ERROR_ACCESS_DENIED)
{ {
char *acl_from = acl_to_text (current_acl, NULL); /* Maybe the requested ACL and the one the file already has
char *acl_to = acl_to_text (acl, NULL); are identical, in which case we can silently ignore the
failure. (And no, Windows doesn't.) */
acl_t current_acl = acl_get_file (fname, ACL_TYPE_ACCESS);
if (acl_from && acl_to && xstrcasecmp (acl_from, acl_to) == 0) errno = EPERM;
if (current_acl)
{ {
retval = 0; char *acl_from = acl_to_text (current_acl, NULL);
errno = e; char *acl_to = acl_to_text (acl, NULL);
if (acl_from && acl_to && xstrcasecmp (acl_from, acl_to) == 0)
{
retval = 0;
errno = e;
}
if (acl_from)
acl_free (acl_from);
if (acl_to)
acl_free (acl_to);
acl_free (current_acl);
} }
if (acl_from)
acl_free (acl_from);
if (acl_to)
acl_free (acl_to);
acl_free (current_acl);
} }
else if (err == ERROR_FILE_NOT_FOUND || err == ERROR_PATH_NOT_FOUND)
errno = ENOENT;
else
errno = EACCES;
}
else
{
retval = 0;
errno = e;
}
if (st)
{
if (st >= 2)
restore_privilege (&old2);
restore_privilege (&old1);
revert_to_self ();
} }
else if (err == ERROR_FILE_NOT_FOUND || err == ERROR_PATH_NOT_FOUND)
errno = ENOENT;
return retval; return retval;
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment