]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Update cursor logic for empty lists
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Tue, 14 Nov 2017 12:37:32 +0000 (12:37 +0000)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Tue, 14 Nov 2017 17:31:47 +0000 (17:31 +0000)
Appending, prepending, inserting, replacing on an empty list should not set current.  That way fr_cursor_next() produces a consistent result on empty lists and populated lists when we're using cursors to track progress.

src/lib/util/cursor.c
src/lib/util/strerror.c
src/main/xlat_eval.c
src/modules/rlm_expr/rlm_expr.c

index fb21d1fde1ccbadd2b4b7fd55e0be9efc71abd0d..7c5c9eb2ec81213f6b9672292d8cde2fd252c992 100644 (file)
@@ -257,8 +257,6 @@ void CC_HINT(hot) fr_cursor_prepend(fr_cursor_t *cursor, void *v)
 
                *NEXT_PTR(v) = NULL;                            /* Only insert one at a time */
 
-               fr_cursor_next(cursor);                         /* Update current */
-
                return;
        }
 
@@ -292,8 +290,6 @@ void CC_HINT(hot) fr_cursor_append(fr_cursor_t *cursor, void *v)
                *cursor->head = v;
                *NEXT_PTR(v) = NULL;                            /* Only insert one at a time */
 
-               fr_cursor_next(cursor);                         /* Update current */
-
                return;
        }
 
@@ -771,7 +767,8 @@ void test_cursor_append_empty(void)
        fr_cursor_append(&cursor, &item1);
 
        item_p = fr_cursor_current(&cursor);
-       TEST_CHECK(item_p == &item1);
+       TEST_CHECK(!item_p);
+       TEST_CHECK(fr_cursor_next_peek(&cursor) == &item1);
        TEST_CHECK(fr_cursor_list_prev_peek(&cursor) == NULL);
 }
 
@@ -790,7 +787,8 @@ void test_cursor_append_empty_3(void)
        fr_cursor_append(&cursor, &item3);
 
        item_p = fr_cursor_current(&cursor);
-       TEST_CHECK(item_p == &item1);
+       TEST_CHECK(!item_p);
+       TEST_CHECK(fr_cursor_next(&cursor) == &item1);
        TEST_CHECK(fr_cursor_next(&cursor) == &item2);
        TEST_CHECK(fr_cursor_tail(&cursor) == &item3);
 }
@@ -806,7 +804,8 @@ void test_cursor_prepend_empty(void)
        fr_cursor_prepend(&cursor, &item1);
 
        item_p = fr_cursor_current(&cursor);
-       TEST_CHECK(item_p == &item1);
+       TEST_CHECK(!item_p);
+       TEST_CHECK(fr_cursor_next_peek(&cursor) == &item1);
        TEST_CHECK(fr_cursor_list_prev_peek(&cursor) == NULL);
 }
 
@@ -821,7 +820,8 @@ void test_cursor_insert_into_empty(void)
        fr_cursor_insert(&cursor, &item1);
 
        item_p = fr_cursor_current(&cursor);
-       TEST_CHECK(item_p == &item1);
+       TEST_CHECK(!item_p);
+       TEST_CHECK(fr_cursor_next_peek(&cursor) == &item1);
        TEST_CHECK(fr_cursor_list_prev_peek(&cursor) == NULL);
 }
 
@@ -840,9 +840,10 @@ void test_cursor_insert_into_empty_3(void)
        fr_cursor_insert(&cursor, &item3);
 
        item_p = fr_cursor_current(&cursor);
-       TEST_CHECK(item_p == &item1);
-       TEST_CHECK(fr_cursor_next(&cursor) == &item3);
-       TEST_CHECK(fr_cursor_tail(&cursor) == &item2);
+       TEST_CHECK(!item_p);
+       TEST_CHECK(fr_cursor_next(&cursor) == &item1);
+       TEST_CHECK(fr_cursor_next(&cursor) == &item2);
+       TEST_CHECK(fr_cursor_tail(&cursor) == &item3);
 }
 
 void test_cursor_replace_in_empty(void)
@@ -856,7 +857,8 @@ void test_cursor_replace_in_empty(void)
        TEST_CHECK(!fr_cursor_replace(&cursor, &item1));
 
        item_p = fr_cursor_current(&cursor);
-       TEST_CHECK(item_p == &item1);
+       TEST_CHECK(!item_p);
+       TEST_CHECK(fr_cursor_next_peek(&cursor) == &item1);
        TEST_CHECK(fr_cursor_list_prev_peek(&cursor) == NULL);
 }
 
@@ -1665,9 +1667,9 @@ void test_cursor_free(void)
        fr_cursor_list_free(&cursor);
 
        TEST_CHECK(fr_cursor_current(&cursor) == NULL);
-       TEST_CHECK(fr_cursor_list_prev_peek(&cursor) == item1);
-       TEST_CHECK(fr_cursor_tail(&cursor) == item1);
-       TEST_CHECK(fr_cursor_head(&cursor) == item1);
+       TEST_CHECK(!fr_cursor_list_prev_peek(&cursor));
+       TEST_CHECK(!fr_cursor_tail(&cursor));
+       TEST_CHECK(!fr_cursor_head(&cursor));
 
        item_p = fr_cursor_remove(&cursor);
        talloc_free(item_p);
index 8ac011459ab1a839a0e42c0b003d942cd88d4e78..5ab3a72ceead67d29ab50cda9bcf21235855d121 100644 (file)
@@ -216,6 +216,7 @@ char const *fr_strerror(void)
        buffer = fr_strerror_buffer;
        if (!buffer) return "";
 
+       fr_cursor_head(&buffer->cursor);
        entry = fr_cursor_remove(&buffer->cursor);
        if (!entry) return "";
 
index 3ce3ea6646c3e2570901cb6f2b47c8b5716f23fe..e0e76efce5485fa7bd0b919ef45d17fffe55a2c3 100644 (file)
@@ -197,7 +197,7 @@ static xlat_action_t xlat_eval_one_letter(TALLOC_CTX *ctx, fr_cursor_t *out, REQ
                return XLAT_ACTION_FAIL;
        }
 
-       fr_cursor_insert(out, value);
+       fr_cursor_append(out, value);
        return XLAT_ACTION_DONE;
 }
 
@@ -529,7 +529,7 @@ static char *xlat_aprint(TALLOC_CTX *ctx, REQUEST *request, xlat_exp_t const * c
        case XLAT_ATTRIBUTE:
                if (xlat_eval_pair(ctx, &cursor, request, node->attr) == XLAT_ACTION_FAIL) return NULL;
 
-               value = fr_cursor_current(&cursor);
+               value = fr_cursor_head(&cursor);
                if (!value) return NULL;
 
                /*
index 6b290bab2f67ec53194d060f0b5f6c84788c4308..d40df232a2da5cf42e213ebc94d06c4b73bb82dc 100644 (file)
@@ -1528,6 +1528,7 @@ static ssize_t explode_xlat(TALLOC_CTX *ctx, char **out, size_t outlen,
                vp = fr_cursor_next(&cursor);
        }
 
+       fr_cursor_head(&to_merge);
        fr_cursor_merge(&cursor, &to_merge);
        talloc_free(vpt);