mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2024-11-21 16:46:54 -08:00
111 lines
4.2 KiB
Diff
111 lines
4.2 KiB
Diff
|
From 646388b696afda85dccc76678af6a8955bf0b627 Mon Sep 17 00:00:00 2001
|
||
|
From: "Erich E. Hoover" <erich.e.hoover@wine-staging.com>
|
||
|
Date: Fri, 16 Oct 2015 16:03:00 -0600
|
||
|
Subject: advapi32: Move the DACL combining code into a separate routine.
|
||
|
|
||
|
---
|
||
|
dlls/advapi32/security.c | 79 +++++++++++++++++++++++++++---------------------
|
||
|
1 file changed, 45 insertions(+), 34 deletions(-)
|
||
|
|
||
|
diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c
|
||
|
index 00dafe8..dad8b22 100644
|
||
|
--- a/dlls/advapi32/security.c
|
||
|
+++ b/dlls/advapi32/security.c
|
||
|
@@ -5805,6 +5805,48 @@ BOOL WINAPI FileEncryptionStatusA(LPCSTR lpFileName, LPDWORD lpStatus)
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
+static NTSTATUS combine_dacls(ACL *parent, ACL *child, ACL **result)
|
||
|
+{
|
||
|
+ ACL *combined;
|
||
|
+ int i;
|
||
|
+
|
||
|
+ /* initialize a combined DACL containing both inherited and new ACEs */
|
||
|
+ combined = heap_alloc_zero(child->AclSize+parent->AclSize);
|
||
|
+ if (!combined)
|
||
|
+ return STATUS_NO_MEMORY;
|
||
|
+
|
||
|
+ memcpy(combined, child, child->AclSize);
|
||
|
+ combined->AclSize = child->AclSize+parent->AclSize;
|
||
|
+
|
||
|
+ /* copy the inherited ACEs */
|
||
|
+ for (i=0; i<parent->AceCount; i++)
|
||
|
+ {
|
||
|
+ ACE_HEADER *ace;
|
||
|
+
|
||
|
+ if (!GetAce(parent, i, (void*)&ace))
|
||
|
+ continue;
|
||
|
+ if (!(ace->AceFlags & (OBJECT_INHERIT_ACE|CONTAINER_INHERIT_ACE)))
|
||
|
+ continue;
|
||
|
+ if ((ace->AceFlags & (OBJECT_INHERIT_ACE|CONTAINER_INHERIT_ACE)) !=
|
||
|
+ (OBJECT_INHERIT_ACE|CONTAINER_INHERIT_ACE))
|
||
|
+ {
|
||
|
+ FIXME("unsupported flags: %x\n", ace->AceFlags);
|
||
|
+ continue;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (ace->AceFlags & NO_PROPAGATE_INHERIT_ACE)
|
||
|
+ ace->AceFlags &= ~(OBJECT_INHERIT_ACE|CONTAINER_INHERIT_ACE|NO_PROPAGATE_INHERIT_ACE);
|
||
|
+ ace->AceFlags &= ~INHERIT_ONLY_ACE;
|
||
|
+ ace->AceFlags |= INHERITED_ACE;
|
||
|
+
|
||
|
+ if (!AddAce(combined, ACL_REVISION, MAXDWORD, ace, ace->AceSize))
|
||
|
+ WARN("error adding inherited ACE\n");
|
||
|
+ }
|
||
|
+
|
||
|
+ *result = combined;
|
||
|
+ return STATUS_SUCCESS;
|
||
|
+}
|
||
|
+
|
||
|
/******************************************************************************
|
||
|
* SetSecurityInfo [ADVAPI32.@]
|
||
|
*/
|
||
|
@@ -5904,41 +5946,10 @@ DWORD WINAPI SetSecurityInfo(HANDLE handle, SE_OBJECT_TYPE ObjectType,
|
||
|
|
||
|
if (!err)
|
||
|
{
|
||
|
- int i;
|
||
|
-
|
||
|
- dacl = heap_alloc_zero(pDacl->AclSize+parent_dacl->AclSize);
|
||
|
- if (!dacl)
|
||
|
- {
|
||
|
- LocalFree(parent_sd);
|
||
|
- return ERROR_NOT_ENOUGH_MEMORY;
|
||
|
- }
|
||
|
- memcpy(dacl, pDacl, pDacl->AclSize);
|
||
|
- dacl->AclSize = pDacl->AclSize+parent_dacl->AclSize;
|
||
|
-
|
||
|
- for (i=0; i<parent_dacl->AceCount; i++)
|
||
|
- {
|
||
|
- ACE_HEADER *ace;
|
||
|
-
|
||
|
- if (!GetAce(parent_dacl, i, (void*)&ace))
|
||
|
- continue;
|
||
|
- if (!(ace->AceFlags & (OBJECT_INHERIT_ACE|CONTAINER_INHERIT_ACE)))
|
||
|
- continue;
|
||
|
- if ((ace->AceFlags & (OBJECT_INHERIT_ACE|CONTAINER_INHERIT_ACE)) !=
|
||
|
- (OBJECT_INHERIT_ACE|CONTAINER_INHERIT_ACE))
|
||
|
- {
|
||
|
- FIXME("unsupported flags: %x\n", ace->AceFlags);
|
||
|
- continue;
|
||
|
- }
|
||
|
-
|
||
|
- if (ace->AceFlags & NO_PROPAGATE_INHERIT_ACE)
|
||
|
- ace->AceFlags &= ~(OBJECT_INHERIT_ACE|CONTAINER_INHERIT_ACE|NO_PROPAGATE_INHERIT_ACE);
|
||
|
- ace->AceFlags &= ~INHERIT_ONLY_ACE;
|
||
|
- ace->AceFlags |= INHERITED_ACE;
|
||
|
-
|
||
|
- if(!AddAce(dacl, ACL_REVISION, MAXDWORD, ace, ace->AceSize))
|
||
|
- WARN("error adding inherited ACE\n");
|
||
|
- }
|
||
|
+ status = combine_dacls(parent_dacl, pDacl, &dacl);
|
||
|
LocalFree(parent_sd);
|
||
|
+ if (status != STATUS_SUCCESS)
|
||
|
+ return RtlNtStatusToDosError(status);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
--
|
||
|
2.6.1
|
||
|
|