[RTL] Allow RtlGetNextRange to be called on a finished iterator. CORE-6372
authorThomas Faber <thomas.faber@reactos.org>
Sun, 16 Aug 2020 14:18:25 +0000 (16:18 +0200)
committerThomas Faber <thomas.faber@reactos.org>
Sun, 16 Aug 2020 14:18:29 +0000 (16:18 +0200)
Fixes crash in kmtest:RtlRangeList.

sdk/lib/rtl/rangelist.c

index ab2de3e..e589d43 100644 (file)
@@ -499,6 +499,12 @@ RtlGetNextRange(IN OUT PRTL_RANGE_LIST_ITERATOR Iterator,
     if (Iterator->Stamp != RangeList->Stamp)
         return STATUS_INVALID_PARAMETER;
 
+    if (Iterator->Current == NULL)
+    {
+        *Range = NULL;
+        return STATUS_NO_MORE_ENTRIES;
+    }
+
     if (MoveForwards)
     {
         Next = ((PRTL_RANGE_ENTRY)Iterator->Current)->Entry.Flink;
@@ -509,7 +515,11 @@ RtlGetNextRange(IN OUT PRTL_RANGE_LIST_ITERATOR Iterator,
     }
 
     if (Next == Iterator->RangeListHead)
+    {
+        Iterator->Current = NULL;
+        *Range = NULL;
         return STATUS_NO_MORE_ENTRIES;
+    }
 
     Iterator->Current = Next;
     *Range = &((PRTL_RANGE_ENTRY)Next)->Range;