fix cxListFind() crashing on empty linked lists

Sun, 23 Feb 2025 13:47:10 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 23 Feb 2025 13:47:10 +0100
changeset 1225
086e63c8dd06
parent 1224
e20e100fa71f
child 1226
129ef9bb1477

fix cxListFind() crashing on empty linked lists

src/linked_list.c file | annotate | diff | comparison | revisions
tests/test_list.c file | annotate | diff | comparison | revisions
--- a/src/linked_list.c	Sun Feb 23 13:25:53 2025 +0100
+++ b/src/linked_list.c	Sun Feb 23 13:47:10 2025 +0100
@@ -920,6 +920,8 @@
         const void *elem,
         bool remove
 ) {
+    if (list->collection.size == 0) return 0;
+
     size_t index;
     cx_linked_list *ll = ((cx_linked_list *) list);
     cx_linked_list_node *node = cx_linked_list_find(
--- a/tests/test_list.c	Sun Feb 23 13:25:53 2025 +0100
+++ b/tests/test_list.c	Sun Feb 23 13:47:10 2025 +0100
@@ -968,16 +968,28 @@
 
 CX_TEST(test_empty_list_at) {
     CX_TEST_DO {
+        // the placeholder empty list
         CX_TEST_ASSERT(cxListAt(cxEmptyList, 0) == NULL);
         CX_TEST_ASSERT(cxListAt(cxEmptyList, 1) == NULL);
+        // a "true" empty list
+        CxList *list = cxLinkedListCreateSimple(sizeof(int));
+        CX_TEST_ASSERT(cxListAt(list, 0) == NULL);
+        CX_TEST_ASSERT(cxListAt(list, 1) == NULL);
+        cxListFree(list);
     }
 }
 
 CX_TEST(test_empty_list_find) {
     int x = 42, y = 1337;
     CX_TEST_DO {
+        // the placeholder empty list
         CX_TEST_ASSERT(cxListFind(cxEmptyList, &x) == 0);
-        CX_TEST_ASSERT(cxListFind(cxEmptyList, &y) == 0);
+        CX_TEST_ASSERT(cxListFindRemove(cxEmptyList, &y) == 0);
+        // a "true" empty list
+        CxList *list = cxLinkedListCreateSimple(sizeof(int));
+        CX_TEST_ASSERT(cxListFind(list, &x) == 0);
+        CX_TEST_ASSERT(cxListFindRemove(list, &y) == 0);
+        cxListFree(list);
     }
 }
 

mercurial