From 3df35a13be1b25adbed1ad219e4fe6d7b8f42e66 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sun, 8 Feb 2015 14:22:26 +0000 Subject: [PATCH] [DDK] - Add additional list entry checks that can be optionally enabled by defining EXTRA_KERNEL_LIST_ENTRY_CHECKS. These checks warn against attempts to remove items from an empty list, which can easily be an error (and is trivial to avoid where it's not). - Enable these checks by default for ReactOS code CORE-8419 #resolve svn path=/trunk/; revision=66208 --- reactos/include/ddk/wdm.h | 16 ++++++++++++++++ reactos/include/xdk/rtlfuncs.h | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/reactos/include/ddk/wdm.h b/reactos/include/ddk/wdm.h index d202e315b20..74aac33f7cb 100644 --- a/reactos/include/ddk/wdm.h +++ b/reactos/include/ddk/wdm.h @@ -9621,6 +9621,10 @@ RtlFailFast( #define NO_KERNEL_LIST_ENTRY_CHECKS #endif +#if !defined(EXTRA_KERNEL_LIST_ENTRY_CHECKS) && defined(__REACTOS__) +#define EXTRA_KERNEL_LIST_ENTRY_CHECKS +#endif + #if !defined(MIDL_PASS) && !defined(SORTPP_PASS) #define RTL_STATIC_LIST_HEAD(x) LIST_ENTRY x = { &x, &x } @@ -9693,6 +9697,10 @@ RemoveEntryList( OldFlink = Entry->Flink; OldBlink = Entry->Blink; #if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) +#ifdef EXTRA_KERNEL_LIST_ENTRY_CHECKS + if (OldFlink == Entry || OldBlink == Entry) + FatalListEntryError(OldBlink, Entry, OldFlink); +#endif if (OldFlink->Blink != Entry || OldBlink->Flink != Entry) FatalListEntryError(OldBlink, Entry, OldFlink); #endif @@ -9711,6 +9719,10 @@ RemoveHeadList( #if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG RtlpCheckListEntry(ListHead); +#ifdef EXTRA_KERNEL_LIST_ENTRY_CHECKS + if (ListHead->Flink == ListHead || ListHead->Blink == ListHead) + FatalListEntryError(ListHead->Blink, ListHead, ListHead->Flink); +#endif #endif Entry = ListHead->Flink; Flink = Entry->Flink; @@ -9733,6 +9745,10 @@ RemoveTailList( #if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG RtlpCheckListEntry(ListHead); +#ifdef EXTRA_KERNEL_LIST_ENTRY_CHECKS + if (ListHead->Flink == ListHead || ListHead->Blink == ListHead) + FatalListEntryError(ListHead->Blink, ListHead, ListHead->Flink); +#endif #endif Entry = ListHead->Blink; Blink = Entry->Blink; diff --git a/reactos/include/xdk/rtlfuncs.h b/reactos/include/xdk/rtlfuncs.h index 394fb1ed39a..96e04860724 100644 --- a/reactos/include/xdk/rtlfuncs.h +++ b/reactos/include/xdk/rtlfuncs.h @@ -35,6 +35,10 @@ RtlFailFast( #define NO_KERNEL_LIST_ENTRY_CHECKS #endif +#if !defined(EXTRA_KERNEL_LIST_ENTRY_CHECKS) && defined(__REACTOS__) +#define EXTRA_KERNEL_LIST_ENTRY_CHECKS +#endif + #if !defined(MIDL_PASS) && !defined(SORTPP_PASS) #define RTL_STATIC_LIST_HEAD(x) LIST_ENTRY x = { &x, &x } @@ -107,6 +111,10 @@ RemoveEntryList( OldFlink = Entry->Flink; OldBlink = Entry->Blink; #if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) +#ifdef EXTRA_KERNEL_LIST_ENTRY_CHECKS + if (OldFlink == Entry || OldBlink == Entry) + FatalListEntryError(OldBlink, Entry, OldFlink); +#endif if (OldFlink->Blink != Entry || OldBlink->Flink != Entry) FatalListEntryError(OldBlink, Entry, OldFlink); #endif @@ -125,6 +133,10 @@ RemoveHeadList( #if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG RtlpCheckListEntry(ListHead); +#ifdef EXTRA_KERNEL_LIST_ENTRY_CHECKS + if (ListHead->Flink == ListHead || ListHead->Blink == ListHead) + FatalListEntryError(ListHead->Blink, ListHead, ListHead->Flink); +#endif #endif Entry = ListHead->Flink; Flink = Entry->Flink; @@ -147,6 +159,10 @@ RemoveTailList( #if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG RtlpCheckListEntry(ListHead); +#ifdef EXTRA_KERNEL_LIST_ENTRY_CHECKS + if (ListHead->Flink == ListHead || ListHead->Blink == ListHead) + FatalListEntryError(ListHead->Blink, ListHead, ListHead->Flink); +#endif #endif Entry = ListHead->Blink; Blink = Entry->Blink;