- Add list entry security checks equivalent to those in current WDKs. This is useful for ROS because it detects memory corruption very quickly.
CORE-8419

svn path=/trunk/; revision=66206
This commit is contained in:
Thomas Faber 2015-02-08 13:22:06 +00:00
parent f2772f2806
commit a5667eedbc
2 changed files with 160 additions and 0 deletions

View file

@ -9617,6 +9617,10 @@ RtlFailFast(
__fastfail(Code); __fastfail(Code);
} }
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && (defined(_M_CEE_PURE) || defined(_M_CEE_SAFE))
#define NO_KERNEL_LIST_ENTRY_CHECKS
#endif
#if !defined(MIDL_PASS) && !defined(SORTPP_PASS) #if !defined(MIDL_PASS) && !defined(SORTPP_PASS)
#define RTL_STATIC_LIST_HEAD(x) LIST_ENTRY x = { &x, &x } #define RTL_STATIC_LIST_HEAD(x) LIST_ENTRY x = { &x, &x }
@ -9638,6 +9642,46 @@ IsListEmpty(
return (BOOLEAN)(ListHead->Flink == ListHead); return (BOOLEAN)(ListHead->Flink == ListHead);
} }
FORCEINLINE
BOOLEAN
RemoveEntryListUnsafe(
_In_ PLIST_ENTRY Entry)
{
PLIST_ENTRY OldFlink;
PLIST_ENTRY OldBlink;
OldFlink = Entry->Flink;
OldBlink = Entry->Blink;
OldFlink->Blink = OldBlink;
OldBlink->Flink = OldFlink;
return (BOOLEAN)(OldFlink == OldBlink);
}
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
FORCEINLINE
VOID
FatalListEntryError(
_In_ PVOID P1,
_In_ PVOID P2,
_In_ PVOID P3)
{
UNREFERENCED_PARAMETER(P1);
UNREFERENCED_PARAMETER(P2);
UNREFERENCED_PARAMETER(P3);
RtlFailFast(FAST_FAIL_CORRUPT_LIST_ENTRY);
}
FORCEINLINE
VOID
RtlpCheckListEntry(
_In_ PLIST_ENTRY Entry)
{
if (Entry->Flink->Blink != Entry || Entry->Blink->Flink != Entry)
FatalListEntryError(Entry->Blink, Entry, Entry->Flink);
}
#endif
FORCEINLINE FORCEINLINE
BOOLEAN BOOLEAN
RemoveEntryList( RemoveEntryList(
@ -9648,6 +9692,10 @@ RemoveEntryList(
OldFlink = Entry->Flink; OldFlink = Entry->Flink;
OldBlink = Entry->Blink; OldBlink = Entry->Blink;
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
if (OldFlink->Blink != Entry || OldBlink->Flink != Entry)
FatalListEntryError(OldBlink, Entry, OldFlink);
#endif
OldFlink->Blink = OldBlink; OldFlink->Blink = OldBlink;
OldBlink->Flink = OldFlink; OldBlink->Flink = OldFlink;
return (BOOLEAN)(OldFlink == OldBlink); return (BOOLEAN)(OldFlink == OldBlink);
@ -9661,8 +9709,15 @@ RemoveHeadList(
PLIST_ENTRY Flink; PLIST_ENTRY Flink;
PLIST_ENTRY Entry; PLIST_ENTRY Entry;
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG
RtlpCheckListEntry(ListHead);
#endif
Entry = ListHead->Flink; Entry = ListHead->Flink;
Flink = Entry->Flink; Flink = Entry->Flink;
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
if (Entry->Blink != ListHead || Flink->Blink != Entry)
FatalListEntryError(ListHead, Entry, Flink);
#endif
ListHead->Flink = Flink; ListHead->Flink = Flink;
Flink->Blink = ListHead; Flink->Blink = ListHead;
return Entry; return Entry;
@ -9676,8 +9731,15 @@ RemoveTailList(
PLIST_ENTRY Blink; PLIST_ENTRY Blink;
PLIST_ENTRY Entry; PLIST_ENTRY Entry;
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG
RtlpCheckListEntry(ListHead);
#endif
Entry = ListHead->Blink; Entry = ListHead->Blink;
Blink = Entry->Blink; Blink = Entry->Blink;
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
if (Blink->Flink != Entry || Entry->Flink != ListHead)
FatalListEntryError(Blink, Entry, ListHead);
#endif
ListHead->Blink = Blink; ListHead->Blink = Blink;
Blink->Flink = ListHead; Blink->Flink = ListHead;
return Entry; return Entry;
@ -9690,9 +9752,16 @@ InsertTailList(
_Inout_ __drv_aliasesMem PLIST_ENTRY Entry) _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
{ {
PLIST_ENTRY OldBlink; PLIST_ENTRY OldBlink;
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG
RtlpCheckListEntry(ListHead);
#endif
OldBlink = ListHead->Blink; OldBlink = ListHead->Blink;
Entry->Flink = ListHead; Entry->Flink = ListHead;
Entry->Blink = OldBlink; Entry->Blink = OldBlink;
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
if (OldBlink->Flink != ListHead)
FatalListEntryError(OldBlink->Blink, OldBlink, ListHead);
#endif
OldBlink->Flink = Entry; OldBlink->Flink = Entry;
ListHead->Blink = Entry; ListHead->Blink = Entry;
} }
@ -9704,9 +9773,16 @@ InsertHeadList(
_Inout_ __drv_aliasesMem PLIST_ENTRY Entry) _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
{ {
PLIST_ENTRY OldFlink; PLIST_ENTRY OldFlink;
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG
RtlpCheckListEntry(ListHead);
#endif
OldFlink = ListHead->Flink; OldFlink = ListHead->Flink;
Entry->Flink = OldFlink; Entry->Flink = OldFlink;
Entry->Blink = ListHead; Entry->Blink = ListHead;
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
if (OldFlink->Blink != ListHead)
FatalListEntryError(ListHead, OldFlink, OldFlink->Flink);
#endif
OldFlink->Blink = Entry; OldFlink->Blink = Entry;
ListHead->Flink = Entry; ListHead->Flink = Entry;
} }
@ -9719,6 +9795,10 @@ AppendTailList(
{ {
PLIST_ENTRY ListEnd = ListHead->Blink; PLIST_ENTRY ListEnd = ListHead->Blink;
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
RtlpCheckListEntry(ListHead);
RtlpCheckListEntry(ListToAppend);
#endif
ListHead->Blink->Flink = ListToAppend; ListHead->Blink->Flink = ListToAppend;
ListHead->Blink = ListToAppend->Blink; ListHead->Blink = ListToAppend->Blink;
ListToAppend->Blink->Flink = ListHead; ListToAppend->Blink->Flink = ListHead;

View file

@ -31,6 +31,10 @@ RtlFailFast(
__fastfail(Code); __fastfail(Code);
} }
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && (defined(_M_CEE_PURE) || defined(_M_CEE_SAFE))
#define NO_KERNEL_LIST_ENTRY_CHECKS
#endif
#if !defined(MIDL_PASS) && !defined(SORTPP_PASS) #if !defined(MIDL_PASS) && !defined(SORTPP_PASS)
#define RTL_STATIC_LIST_HEAD(x) LIST_ENTRY x = { &x, &x } #define RTL_STATIC_LIST_HEAD(x) LIST_ENTRY x = { &x, &x }
@ -52,6 +56,46 @@ IsListEmpty(
return (BOOLEAN)(ListHead->Flink == ListHead); return (BOOLEAN)(ListHead->Flink == ListHead);
} }
FORCEINLINE
BOOLEAN
RemoveEntryListUnsafe(
_In_ PLIST_ENTRY Entry)
{
PLIST_ENTRY OldFlink;
PLIST_ENTRY OldBlink;
OldFlink = Entry->Flink;
OldBlink = Entry->Blink;
OldFlink->Blink = OldBlink;
OldBlink->Flink = OldFlink;
return (BOOLEAN)(OldFlink == OldBlink);
}
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
FORCEINLINE
VOID
FatalListEntryError(
_In_ PVOID P1,
_In_ PVOID P2,
_In_ PVOID P3)
{
UNREFERENCED_PARAMETER(P1);
UNREFERENCED_PARAMETER(P2);
UNREFERENCED_PARAMETER(P3);
RtlFailFast(FAST_FAIL_CORRUPT_LIST_ENTRY);
}
FORCEINLINE
VOID
RtlpCheckListEntry(
_In_ PLIST_ENTRY Entry)
{
if (Entry->Flink->Blink != Entry || Entry->Blink->Flink != Entry)
FatalListEntryError(Entry->Blink, Entry, Entry->Flink);
}
#endif
FORCEINLINE FORCEINLINE
BOOLEAN BOOLEAN
RemoveEntryList( RemoveEntryList(
@ -62,6 +106,10 @@ RemoveEntryList(
OldFlink = Entry->Flink; OldFlink = Entry->Flink;
OldBlink = Entry->Blink; OldBlink = Entry->Blink;
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
if (OldFlink->Blink != Entry || OldBlink->Flink != Entry)
FatalListEntryError(OldBlink, Entry, OldFlink);
#endif
OldFlink->Blink = OldBlink; OldFlink->Blink = OldBlink;
OldBlink->Flink = OldFlink; OldBlink->Flink = OldFlink;
return (BOOLEAN)(OldFlink == OldBlink); return (BOOLEAN)(OldFlink == OldBlink);
@ -75,8 +123,15 @@ RemoveHeadList(
PLIST_ENTRY Flink; PLIST_ENTRY Flink;
PLIST_ENTRY Entry; PLIST_ENTRY Entry;
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG
RtlpCheckListEntry(ListHead);
#endif
Entry = ListHead->Flink; Entry = ListHead->Flink;
Flink = Entry->Flink; Flink = Entry->Flink;
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
if (Entry->Blink != ListHead || Flink->Blink != Entry)
FatalListEntryError(ListHead, Entry, Flink);
#endif
ListHead->Flink = Flink; ListHead->Flink = Flink;
Flink->Blink = ListHead; Flink->Blink = ListHead;
return Entry; return Entry;
@ -90,8 +145,15 @@ RemoveTailList(
PLIST_ENTRY Blink; PLIST_ENTRY Blink;
PLIST_ENTRY Entry; PLIST_ENTRY Entry;
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG
RtlpCheckListEntry(ListHead);
#endif
Entry = ListHead->Blink; Entry = ListHead->Blink;
Blink = Entry->Blink; Blink = Entry->Blink;
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
if (Blink->Flink != Entry || Entry->Flink != ListHead)
FatalListEntryError(Blink, Entry, ListHead);
#endif
ListHead->Blink = Blink; ListHead->Blink = Blink;
Blink->Flink = ListHead; Blink->Flink = ListHead;
return Entry; return Entry;
@ -104,9 +166,16 @@ InsertTailList(
_Inout_ __drv_aliasesMem PLIST_ENTRY Entry) _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
{ {
PLIST_ENTRY OldBlink; PLIST_ENTRY OldBlink;
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG
RtlpCheckListEntry(ListHead);
#endif
OldBlink = ListHead->Blink; OldBlink = ListHead->Blink;
Entry->Flink = ListHead; Entry->Flink = ListHead;
Entry->Blink = OldBlink; Entry->Blink = OldBlink;
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
if (OldBlink->Flink != ListHead)
FatalListEntryError(OldBlink->Blink, OldBlink, ListHead);
#endif
OldBlink->Flink = Entry; OldBlink->Flink = Entry;
ListHead->Blink = Entry; ListHead->Blink = Entry;
} }
@ -118,9 +187,16 @@ InsertHeadList(
_Inout_ __drv_aliasesMem PLIST_ENTRY Entry) _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
{ {
PLIST_ENTRY OldFlink; PLIST_ENTRY OldFlink;
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG
RtlpCheckListEntry(ListHead);
#endif
OldFlink = ListHead->Flink; OldFlink = ListHead->Flink;
Entry->Flink = OldFlink; Entry->Flink = OldFlink;
Entry->Blink = ListHead; Entry->Blink = ListHead;
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
if (OldFlink->Blink != ListHead)
FatalListEntryError(ListHead, OldFlink, OldFlink->Flink);
#endif
OldFlink->Blink = Entry; OldFlink->Blink = Entry;
ListHead->Flink = Entry; ListHead->Flink = Entry;
} }
@ -133,6 +209,10 @@ AppendTailList(
{ {
PLIST_ENTRY ListEnd = ListHead->Blink; PLIST_ENTRY ListEnd = ListHead->Blink;
#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
RtlpCheckListEntry(ListHead);
RtlpCheckListEntry(ListToAppend);
#endif
ListHead->Blink->Flink = ListToAppend; ListHead->Blink->Flink = ListToAppend;
ListHead->Blink = ListToAppend->Blink; ListHead->Blink = ListToAppend->Blink;
ListToAppend->Blink->Flink = ListHead; ListToAppend->Blink->Flink = ListHead;