ntdll: NtAccessCheck: Only send used bytes to server.
This commit is contained in:
parent
7c8330ac9a
commit
ab07d61b91
|
@ -45,6 +45,20 @@ WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
|
||||||
|
|
||||||
#define NT_SUCCESS(status) (status == STATUS_SUCCESS)
|
#define NT_SUCCESS(status) (status == STATUS_SUCCESS)
|
||||||
|
|
||||||
|
/* helper function to retrieve active length of an ACL */
|
||||||
|
static size_t acl_bytesInUse(PACL pAcl)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
size_t bytesInUse = sizeof(ACL);
|
||||||
|
PACE_HEADER ace = (PACE_HEADER) (pAcl + 1);
|
||||||
|
for (i = 0; i < pAcl->AceCount; i++)
|
||||||
|
{
|
||||||
|
bytesInUse += ace->AceSize;
|
||||||
|
ace = (PACE_HEADER)(((BYTE*)ace)+ace->AceSize);
|
||||||
|
}
|
||||||
|
return bytesInUse;
|
||||||
|
}
|
||||||
|
|
||||||
/* helper function to copy an ACL */
|
/* helper function to copy an ACL */
|
||||||
static BOOLEAN copy_acl(DWORD nDestinationAclLength, PACL pDestinationAcl, PACL pSourceAcl)
|
static BOOLEAN copy_acl(DWORD nDestinationAclLength, PACL pDestinationAcl, PACL pSourceAcl)
|
||||||
{
|
{
|
||||||
|
@ -655,7 +669,7 @@ NTSTATUS WINAPI RtlGetSaclSecurityDescriptor(
|
||||||
SECURITY_DESCRIPTOR* lpsd=pSecurityDescriptor;
|
SECURITY_DESCRIPTOR* lpsd=pSecurityDescriptor;
|
||||||
|
|
||||||
TRACE("(%p,%p,%p,%p)\n",
|
TRACE("(%p,%p,%p,%p)\n",
|
||||||
pSecurityDescriptor, lpbSaclPresent, *pSacl, lpbSaclDefaulted);
|
pSecurityDescriptor, lpbSaclPresent, pSacl, lpbSaclDefaulted);
|
||||||
|
|
||||||
if (lpsd->Revision != SECURITY_DESCRIPTOR_REVISION)
|
if (lpsd->Revision != SECURITY_DESCRIPTOR_REVISION)
|
||||||
return STATUS_UNKNOWN_REVISION;
|
return STATUS_UNKNOWN_REVISION;
|
||||||
|
@ -1553,9 +1567,9 @@ NtAccessCheck(
|
||||||
RtlGetGroupSecurityDescriptor( SecurityDescriptor, &group, &defaulted );
|
RtlGetGroupSecurityDescriptor( SecurityDescriptor, &group, &defaulted );
|
||||||
sd.group_len = RtlLengthSid( group );
|
sd.group_len = RtlLengthSid( group );
|
||||||
RtlGetSaclSecurityDescriptor( SecurityDescriptor, &present, &sacl, &defaulted );
|
RtlGetSaclSecurityDescriptor( SecurityDescriptor, &present, &sacl, &defaulted );
|
||||||
sd.sacl_len = ((present && sacl) ? sacl->AclSize : 0);
|
sd.sacl_len = ((present && sacl) ? acl_bytesInUse(sacl) : 0);
|
||||||
RtlGetDaclSecurityDescriptor( SecurityDescriptor, &present, &dacl, &defaulted );
|
RtlGetDaclSecurityDescriptor( SecurityDescriptor, &present, &dacl, &defaulted );
|
||||||
sd.dacl_len = ((present && dacl) ? dacl->AclSize : 0);
|
sd.dacl_len = ((present && dacl) ? acl_bytesInUse(dacl) : 0);
|
||||||
|
|
||||||
wine_server_add_data( req, &sd, sizeof(sd) );
|
wine_server_add_data( req, &sd, sizeof(sd) );
|
||||||
wine_server_add_data( req, owner, sd.owner_len );
|
wine_server_add_data( req, owner, sd.owner_len );
|
||||||
|
@ -1637,7 +1651,7 @@ NTSTATUS WINAPI NtSetSecurityObject(HANDLE Handle,
|
||||||
{
|
{
|
||||||
status = RtlGetSaclSecurityDescriptor( SecurityDescriptor, &present, &sacl, &defaulted );
|
status = RtlGetSaclSecurityDescriptor( SecurityDescriptor, &present, &sacl, &defaulted );
|
||||||
if (status != STATUS_SUCCESS) return status;
|
if (status != STATUS_SUCCESS) return status;
|
||||||
sd.sacl_len = (sacl && present) ? sacl->AclSize : 0;
|
sd.sacl_len = (sacl && present) ? acl_bytesInUse(sacl) : 0;
|
||||||
sd.control |= SE_SACL_PRESENT;
|
sd.control |= SE_SACL_PRESENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1645,7 +1659,7 @@ NTSTATUS WINAPI NtSetSecurityObject(HANDLE Handle,
|
||||||
{
|
{
|
||||||
status = RtlGetDaclSecurityDescriptor( SecurityDescriptor, &present, &dacl, &defaulted );
|
status = RtlGetDaclSecurityDescriptor( SecurityDescriptor, &present, &dacl, &defaulted );
|
||||||
if (status != STATUS_SUCCESS) return status;
|
if (status != STATUS_SUCCESS) return status;
|
||||||
sd.dacl_len = (dacl && present) ? dacl->AclSize : 0;
|
sd.dacl_len = (dacl && present) ? acl_bytesInUse(dacl) : 0;
|
||||||
sd.control |= SE_DACL_PRESENT;
|
sd.control |= SE_DACL_PRESENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1745,23 +1759,11 @@ NTSTATUS WINAPI RtlQueryInformationAcl(
|
||||||
status = STATUS_INVALID_PARAMETER;
|
status = STATUS_INVALID_PARAMETER;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
INT i;
|
|
||||||
PACE_HEADER ace;
|
|
||||||
|
|
||||||
paclsize->AceCount = pAcl->AceCount;
|
paclsize->AceCount = pAcl->AceCount;
|
||||||
|
paclsize->AclBytesInUse = acl_bytesInUse(pAcl);
|
||||||
paclsize->AclBytesInUse = 0;
|
|
||||||
ace = (PACE_HEADER) (pAcl + 1);
|
|
||||||
|
|
||||||
for (i = 0; i < pAcl->AceCount; i++)
|
|
||||||
{
|
|
||||||
paclsize->AclBytesInUse += ace->AceSize;
|
|
||||||
ace = (PACE_HEADER)(((BYTE*)ace)+ace->AceSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pAcl->AclSize < paclsize->AclBytesInUse)
|
if (pAcl->AclSize < paclsize->AclBytesInUse)
|
||||||
{
|
{
|
||||||
WARN("Acl has %d bytes free\n", paclsize->AclBytesFree);
|
WARN("Acl uses %d bytes, but only has %d allocated! Returning smaller of the two values.\n", pAcl->AclSize, paclsize->AclBytesInUse);
|
||||||
paclsize->AclBytesFree = 0;
|
paclsize->AclBytesFree = 0;
|
||||||
paclsize->AclBytesInUse = pAcl->AclSize;
|
paclsize->AclBytesInUse = pAcl->AclSize;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue