From d1aeb20e331f6f95caa69d5878cfbb52db586b75 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Tue, 24 Nov 2009 22:56:43 +0000 Subject: [PATCH] [ntoskrnl/cm] - CmpSelectLeaf fixes: looking into an incorrect cell, returning wrong cell, slightly simplify code and add more comments for clarity. Thanks to Michael Martin for spotting these bugs. svn path=/trunk/; revision=44285 --- reactos/ntoskrnl/config/cmindex.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/reactos/ntoskrnl/config/cmindex.c b/reactos/ntoskrnl/config/cmindex.c index e48977523b7..162263d7590 100644 --- a/reactos/ntoskrnl/config/cmindex.c +++ b/reactos/ntoskrnl/config/cmindex.c @@ -1344,6 +1344,8 @@ CmpSelectLeaf(IN PHHIVE Hive, *RootCell = &IndexKey->List[SubKeyIndex]; return LeafCell; } + + /* It didn't fit, so proceed to splitting */ } else { @@ -1380,22 +1382,22 @@ CmpSelectLeaf(IN PHHIVE Hive, /* Check if it's above */ if (Result >= 0) { - /* Get the first cell in the index */ - LeafCell = IndexKey->List[0]; + /* Get the cell in the index */ + LeafCell = IndexKey->List[SubKeyIndex]; LeafKey = (PCM_KEY_INDEX)HvGetCell(Hive, LeafCell); /* Return an error in case of problems */ if (!LeafKey) return HCELL_NIL; - /* Check if it fits into this leaf and break */ + /* Check if it fits into this leaf */ if (LeafKey->Count < CmpMaxIndexPerHblock) { /* Fill in the result and return the cell */ - *RootCell = &IndexKey->List[SubKeyIndex + 1]; + *RootCell = &IndexKey->List[SubKeyIndex]; return LeafCell; } - /* No, it doesn't fit, check the other leaf */ + /* No, it doesn't fit, check the next adjacent leaf */ if (SubKeyIndex < (IndexKey->Count - 1)) { /* Yes, there is space */ @@ -1413,6 +1415,8 @@ CmpSelectLeaf(IN PHHIVE Hive, return LeafCell; } } + + /* It didn't fit, so proceed to splitting */ } else { @@ -1429,11 +1433,8 @@ CmpSelectLeaf(IN PHHIVE Hive, /* Check if it fits and break */ if (LeafKey->Count < CmpMaxIndexPerHblock) { - /* Decrement the subkey index */ - SubKeyIndex--; - /* Fill in the result and return the cell */ - *RootCell = &IndexKey->List[SubKeyIndex]; + *RootCell = &IndexKey->List[SubKeyIndex - 1]; return LeafCell; } }