[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
This commit is contained in:
Aleksey Bragin 2009-11-24 22:56:43 +00:00
parent 5040fe13f1
commit d1aeb20e33

View file

@ -1344,6 +1344,8 @@ CmpSelectLeaf(IN PHHIVE Hive,
*RootCell = &IndexKey->List[SubKeyIndex]; *RootCell = &IndexKey->List[SubKeyIndex];
return LeafCell; return LeafCell;
} }
/* It didn't fit, so proceed to splitting */
} }
else else
{ {
@ -1380,22 +1382,22 @@ CmpSelectLeaf(IN PHHIVE Hive,
/* Check if it's above */ /* Check if it's above */
if (Result >= 0) if (Result >= 0)
{ {
/* Get the first cell in the index */ /* Get the cell in the index */
LeafCell = IndexKey->List[0]; LeafCell = IndexKey->List[SubKeyIndex];
LeafKey = (PCM_KEY_INDEX)HvGetCell(Hive, LeafCell); LeafKey = (PCM_KEY_INDEX)HvGetCell(Hive, LeafCell);
/* Return an error in case of problems */ /* Return an error in case of problems */
if (!LeafKey) return HCELL_NIL; 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) if (LeafKey->Count < CmpMaxIndexPerHblock)
{ {
/* Fill in the result and return the cell */ /* Fill in the result and return the cell */
*RootCell = &IndexKey->List[SubKeyIndex + 1]; *RootCell = &IndexKey->List[SubKeyIndex];
return LeafCell; 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)) if (SubKeyIndex < (IndexKey->Count - 1))
{ {
/* Yes, there is space */ /* Yes, there is space */
@ -1413,6 +1415,8 @@ CmpSelectLeaf(IN PHHIVE Hive,
return LeafCell; return LeafCell;
} }
} }
/* It didn't fit, so proceed to splitting */
} }
else else
{ {
@ -1429,11 +1433,8 @@ CmpSelectLeaf(IN PHHIVE Hive,
/* Check if it fits and break */ /* Check if it fits and break */
if (LeafKey->Count < CmpMaxIndexPerHblock) if (LeafKey->Count < CmpMaxIndexPerHblock)
{ {
/* Decrement the subkey index */
SubKeyIndex--;
/* Fill in the result and return the cell */ /* Fill in the result and return the cell */
*RootCell = &IndexKey->List[SubKeyIndex]; *RootCell = &IndexKey->List[SubKeyIndex - 1];
return LeafCell; return LeafCell;
} }
} }