- Get rid of GCC specific typecasts to PVOID for pointer arithmetics
- Decrement the AceCount in RtlDeleteAce instead of incrementing it
Modified: trunk/reactos/lib/rtl/acl.c
_____
Modified: trunk/reactos/lib/rtl/acl.c
--- trunk/reactos/lib/rtl/acl.c 2005-06-30 17:00:19 UTC (rev 16356)
+++ trunk/reactos/lib/rtl/acl.c 2005-06-30 21:38:39 UTC (rev 16357)
@@ -23,23 +23,25 @@
PACE* Ace)
{
PACE Current;
- PVOID AclEnd;
+ ULONG_PTR AclEnd;
ULONG i;
PAGED_CODE_RTL();
Current = (PACE)(Acl + 1);
*Ace = NULL;
- i = 0;
+
if (Acl->AceCount == 0)
{
*Ace = Current;
return(TRUE);
}
- AclEnd = Acl->AclSize + (PVOID)Acl;
+
+ i = 0;
+ AclEnd = (ULONG_PTR)Acl + Acl->AclSize;
do
{
- if ((PVOID)Current >= AclEnd)
+ if ((ULONG_PTR)Current >= AclEnd)
{
return(FALSE);
}
@@ -48,12 +50,11 @@
{
return(FALSE);
}
- Current = (PACE)((ULONG_PTR)Current +
(ULONG_PTR)Current->Header.AceSize);
- i++;
+ Current = (PACE)((ULONG_PTR)Current + Current->Header.AceSize);
}
- while (i < Acl->AceCount);
+ while (++i < Acl->AceCount);
- if ((PVOID)Current < AclEnd)
+ if ((ULONG_PTR)Current < AclEnd)
{
*Ace = Current;
}
@@ -74,29 +75,25 @@
PAGED_CODE_RTL();
- *Ace = (PACE)(Acl + 1);
-
if (Acl->AclRevision < MIN_ACL_REVISION ||
- Acl->AclRevision > MAX_ACL_REVISION)
+ Acl->AclRevision > MAX_ACL_REVISION ||
+ AceIndex >= Acl->AceCount)
{
return(STATUS_INVALID_PARAMETER);
}
+
+ *Ace = (PACE)(Acl + 1);
- if (AceIndex >= Acl->AceCount)
- {
- return(STATUS_INVALID_PARAMETER);
- }
-
for (i = 0; i < AceIndex; i++)
{
- if ((PVOID)*Ace >= (PVOID)Acl + Acl->AclSize)
+ if ((ULONG_PTR)*Ace >= (ULONG_PTR)Acl + Acl->AclSize)
{
return(STATUS_INVALID_PARAMETER);
}
- *Ace = (PACE)((PVOID)(*Ace) + (ULONG)(*Ace)->Header.AceSize);
+ *Ace = (PACE)((ULONG_PTR)(*Ace) + (*Ace)->Header.AceSize);
}
- if ((PVOID)*Ace >= (PVOID)Acl + Acl->AclSize)
+ if ((ULONG_PTR)*Ace >= (ULONG_PTR)Acl + Acl->AclSize)
{
return(STATUS_INVALID_PARAMETER);
}
@@ -244,16 +241,16 @@
{
if (Offset > 0)
{
- memcpy((PVOID)Ace + AceListLength,
- Ace,
- Offset);
+ RtlCopyMemory((PVOID)((ULONG_PTR)Ace + AceListLength),
+ Ace,
+ Offset);
}
if (AceListLength != 0)
{
- memcpy(Ace,
- AceList,
- AceListLength);
+ RtlCopyMemory(Ace,
+ AceList,
+ AceListLength);
}
}
@@ -276,48 +273,40 @@
PAGED_CODE_RTL();
if (Acl->AclRevision < MIN_ACL_REVISION ||
- Acl->AclRevision > MAX_ACL_REVISION)
+ Acl->AclRevision > MAX_ACL_REVISION ||
+ !RtlFirstFreeAce(Acl, &Ace))
{
return(STATUS_INVALID_PARAMETER);
}
- if (!RtlFirstFreeAce(Acl,&Ace))
- {
- return(STATUS_INVALID_PARAMETER);
- }
-
if (Acl->AclRevision <= AclRevision)
{
AclRevision = Acl->AclRevision;
}
- if (((PVOID)AceList + AceListLength) <= (PVOID)AceList)
+ if (((ULONG_PTR)AceList + AceListLength) <= (ULONG_PTR)AceList)
{
return(STATUS_INVALID_PARAMETER);
}
i = 0;
Current = (PACE)(Acl + 1);
- while ((PVOID)Current < ((PVOID)AceList + AceListLength))
+ while ((ULONG_PTR)Current < ((ULONG_PTR)AceList + AceListLength))
{
if (AceList->Header.AceType == ACCESS_ALLOWED_COMPOUND_ACE_TYPE
&&
AclRevision < ACL_REVISION3)
{
return(STATUS_INVALID_PARAMETER);
}
- Current = (PACE)((PVOID)Current + Current->Header.AceSize);
+ Current = (PACE)((ULONG_PTR)Current + Current->Header.AceSize);
}
- if (Ace == NULL)
+ if (Ace == NULL ||
+ ((ULONG_PTR)Ace + AceListLength) >= ((ULONG_PTR)Acl +
Acl->AclSize))
{
return(STATUS_BUFFER_TOO_SMALL);
}
- if (((PVOID)Ace + AceListLength) >= ((PVOID)Acl + Acl->AclSize))
- {
- return(STATUS_BUFFER_TOO_SMALL);
- }
-
if (StartingIndex != 0)
{
if (Acl->AceCount > 0)
@@ -325,7 +314,7 @@
Current = (PACE)(Acl + 1);
for (j = 0; j < StartingIndex; j++)
{
- Current = (PACE)((PVOID)Current + Current->Header.AceSize);
+ Current = (PACE)((ULONG_PTR)Current +
Current->Header.AceSize);
}
}
}
@@ -333,7 +322,7 @@
RtlpAddData(AceList,
AceListLength,
Current,
- (ULONG)Ace - (ULONG)Current);
+ (ULONG)((ULONG_PTR)Ace - (ULONG_PTR)Current));
Acl->AceCount = Acl->AceCount + i;
Acl->AclRevision = AclRevision;
@@ -388,16 +377,12 @@
return(STATUS_INVALID_ACL);
}
- if (Ace == NULL)
+ if (Ace == NULL ||
+ ((ULONG_PTR)Ace + RtlLengthSid(Sid) + sizeof(ACE)) >
((ULONG_PTR)Acl + Acl->AclSize))
{
return(STATUS_ALLOTTED_SPACE_EXCEEDED);
}
- if (((PVOID)Ace + RtlLengthSid(Sid) + sizeof(ACE)) >= ((PVOID)Acl +
Acl->AclSize))
- {
- return(STATUS_ALLOTTED_SPACE_EXCEEDED);
- }
-
Ace->Header.AceFlags = Flags;
Ace->Header.AceType = SYSTEM_AUDIT_ACE_TYPE;
Ace->Header.AceSize = RtlLengthSid(Sid) + sizeof(ACE);
@@ -459,16 +444,12 @@
return STATUS_INVALID_ACL;
}
- if (Ace == NULL)
+ if (Ace == NULL ||
+ ((ULONG_PTR)Ace + RtlLengthSid(Sid) + sizeof(ACE)) >=
((ULONG_PTR)Acl + Acl->AclSize))
{
return STATUS_ALLOTTED_SPACE_EXCEEDED;
}
- if (((PVOID)Ace + RtlLengthSid(Sid) + sizeof(ACE)) >= ((PVOID)Acl +
Acl->AclSize))
- {
- return STATUS_ALLOTTED_SPACE_EXCEEDED;
- }
-
Ace->Header.AceFlags = Flags;
Ace->Header.AceType = SYSTEM_AUDIT_ACE_TYPE;
Ace->Header.AceSize = RtlLengthSid(Sid) + sizeof(ACE);
@@ -490,16 +471,15 @@
{
if (AceSize < Offset)
{
- memcpy(Ace,
- (PUCHAR)Ace + AceSize,
- Offset - AceSize);
+ RtlCopyMemory(Ace,
+ (PVOID)((ULONG_PTR)Ace + AceSize),
+ Offset - AceSize);
}
if (Offset - AceSize < Offset)
{
- memset((PUCHAR)Ace + Offset - AceSize,
- 0,
- AceSize);
+ RtlZeroMemory((PVOID)((ULONG_PTR)Ace + Offset - AceSize),
+ AceSize);
}
}
@@ -517,32 +497,24 @@
PAGED_CODE_RTL();
if (Acl->AclRevision < MIN_ACL_REVISION ||
- Acl->AclRevision > MAX_ACL_REVISION)
+ Acl->AclRevision > MAX_ACL_REVISION ||
+ Acl->AceCount <= AceIndex ||
+ !RtlFirstFreeAce(Acl, &Ace))
{
return(STATUS_INVALID_PARAMETER);
}
- if (Acl->AceCount <= AceIndex)
- {
- return(STATUS_INVALID_PARAMETER);
- }
-
- if (!RtlFirstFreeAce(Acl, &Ace))
- {
- return(STATUS_INVALID_PARAMETER);
- }
-
Current = (PACE)(Acl + 1);
while(AceIndex--)
{
- Current = (PACE)((PVOID)Current + Current->Header.AceSize);
+ Current = (PACE)((ULONG_PTR)Current + Current->Header.AceSize);
}
RtlpDeleteData(Current,
Current->Header.AceSize,
- Ace - Current);
- Acl->AceCount++;
+ (ULONG)((ULONG_PTR)Ace - (ULONG_PTR)Current));
+ Acl->AceCount--;
return(STATUS_SUCCESS);
}
@@ -558,22 +530,18 @@
{
PAGED_CODE_RTL();
- if (AclSize < 8)
+ if (AclSize < sizeof(ACL))
{
return(STATUS_BUFFER_TOO_SMALL);
}
if (AclRevision < MIN_ACL_REVISION ||
- AclRevision > MAX_ACL_REVISION)
+ AclRevision > MAX_ACL_REVISION ||
+ AclSize > 0xffff)
{
return(STATUS_INVALID_PARAMETER);
}
- if (AclSize > 0xffff)
- {
- return(STATUS_INVALID_PARAMETER);
- }
-
AclSize = ROUND_UP(AclSize, 4);
Acl->AclSize = AclSize;
Acl->AclRevision = AclRevision;
@@ -635,7 +603,7 @@
Info->AceCount = Acl->AceCount;
if (Ace != NULL)
{
- Info->AclBytesInUse = (PVOID)Ace - (PVOID)Acl;
+ Info->AclBytesInUse = (DWORD)((ULONG_PTR)Ace -
(ULONG_PTR)Acl);
Info->AclBytesFree = Acl->AclSize -
Info->AclBytesInUse;
}
else