diff --git a/ChangeLog b/ChangeLog index 0604f3d..3ce8171 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2026-06-28 Todd White + * Source/CFArray.c (CFArrayGetLastIndexOfValue): Start the backward + scan at range.location + range.length - 1 instead of one past the + end of the range. + * Tests/CFArray/create.m: Regression test. + 2021-09-30 Frederik Seiffert * Source/CFDate.c: Fix logic in CFGregorianDateIsValid() diff --git a/Source/CFArray.c b/Source/CFArray.c index 1c3da65..cdacaf5 100644 --- a/Source/CFArray.c +++ b/Source/CFArray.c @@ -383,7 +383,7 @@ CFArrayGetLastIndexOfValue (CFArrayRef array, CFRange range, const void *value) equal = array->_callBacks->equal; start = range.location; - idx = start + range.length; + idx = start + range.length - 1; if (equal) { diff --git a/Tests/CFArray/create.m b/Tests/CFArray/create.m index 8dcb0ac..1680f5d 100644 --- a/Tests/CFArray/create.m +++ b/Tests/CFArray/create.m @@ -19,7 +19,13 @@ int main (void) n = (CFIndex)CFArrayGetValueAtIndex (a, 1); PASS_CF(n == 2, "Found value at index %d.", (int)n); - + + n = CFArrayGetLastIndexOfValue (a, CFRangeMake(0, ARRAY_SIZE), (const void*)4); + PASS_CF(n == 3, "Last index of value 4 is %d.", (int)n); + /* Searching the whole array must not read one past the end of the range. */ + n = CFArrayGetLastIndexOfValue (a, CFRangeMake(0, ARRAY_SIZE), (const void*)99); + PASS_CF(n == -1, "Absent value is reported as not found (%d).", (int)n); + CFRelease (a); a = CFArrayCreate (NULL, NULL, 0, NULL);