summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/sec_helper.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/sec_helper.cc')
-rw-r--r--winsup/cygwin/sec_helper.cc60
1 files changed, 59 insertions, 1 deletions
diff --git a/winsup/cygwin/sec_helper.cc b/winsup/cygwin/sec_helper.cc
index eee4886b1..d44705b2f 100644
--- a/winsup/cygwin/sec_helper.cc
+++ b/winsup/cygwin/sec_helper.cc
@@ -1,7 +1,7 @@
/* sec_helper.cc: NT security helper functions
Copyright 2000, 2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009,
- 2010, 2011 Red Hat, Inc.
+ 2010, 2011, 2012 Red Hat, Inc.
Written by Corinna Vinschen <corinna@vinschen.de>
@@ -578,6 +578,64 @@ __sec_user (PVOID sa_buf, PSID sid1, PSID sid2, DWORD access2, BOOL inherit)
return psa;
}
+/* Helper function to create a file security descriptor which allows
+ full access to admins, system, and the sid given as parameter. See
+ try_to_bin for how it's used. */
+
+PSECURITY_DESCRIPTOR
+_recycler_sd (void *buf, bool users, bool dir)
+{
+ NTSTATUS status;
+ PSECURITY_DESCRIPTOR psd = (PSECURITY_DESCRIPTOR) buf;
+
+ if (!psd)
+ return NULL;
+ RtlCreateSecurityDescriptor (psd, SECURITY_DESCRIPTOR_REVISION);
+ PACL dacl = (PACL) (psd + 1);
+ /* Pre-Vista, the per-user recycler dir has a rather too complicated
+ ACL by default, which has distinct ACEs for inheritable and non-inheritable
+ permissions. However, this ACL is practically equivalent to the ACL
+ created since Vista. Therefore we simplify our job here and create the
+ pre-Vista permissions the same way as on Vista and later. */
+ RtlCreateAcl (dacl, MAX_DACL_LEN (3), ACL_REVISION);
+ RtlAddAccessAllowedAceEx (dacl, ACL_REVISION,
+ dir ? CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE
+ : NO_INHERITANCE,
+ FILE_ALL_ACCESS, well_known_admins_sid);
+ RtlAddAccessAllowedAceEx (dacl, ACL_REVISION,
+ dir ? CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE
+ : NO_INHERITANCE,
+ FILE_ALL_ACCESS, well_known_system_sid);
+ if (users)
+ RtlAddAccessAllowedAceEx (dacl, ACL_REVISION, NO_PROPAGATE_INHERIT_ACE,
+ FILE_GENERIC_READ | FILE_GENERIC_EXECUTE
+ | FILE_APPEND_DATA | FILE_WRITE_ATTRIBUTES,
+ well_known_users_sid);
+ else
+ RtlAddAccessAllowedAceEx (dacl, ACL_REVISION,
+ dir ? CONTAINER_INHERIT_ACE
+ | OBJECT_INHERIT_ACE
+ : NO_INHERITANCE,
+ FILE_ALL_ACCESS, cygheap->user.sid ());
+ LPVOID ace;
+ status = RtlFirstFreeAce (dacl, &ace);
+ if (!NT_SUCCESS (status))
+ {
+ debug_printf ("RtlFirstFreeAce: %p", status);
+ return NULL;
+ }
+ dacl->AclSize = (char *) ace - (char *) dacl;
+ RtlSetDaclSecurityDescriptor (psd, TRUE, dacl, FALSE);
+ /* If the directory DACL is not marked as protected, shell32 thinks
+ the recycle dir is corrupted. As soon as Explorer accesses the
+ Recycler, the user will get a GUI dialog "The Recycle Bin on X:\
+ is corrupted. Do you want to empty the Recycle Bin for this drive?"
+ Of course we want to avoid that. */
+ if (dir)
+ psd->Control |= SE_DACL_PROTECTED;
+ return psd;
+}
+
/* Helper function to create an event security descriptor which only allows
specific access to everyone. Only the creating process has all access
rights. */