From: Arran Cudbard-Bell Date: Tue, 14 Nov 2017 12:37:32 +0000 (+0000) Subject: Update cursor logic for empty lists X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=26afe2bc6c2a578cf82dddbcdd19ecfbd15aa9dc;p=thirdparty%2Ffreeradius-server.git Update cursor logic for empty lists 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. --- diff --git a/src/lib/util/cursor.c b/src/lib/util/cursor.c index fb21d1fde1c..7c5c9eb2ec8 100644 --- a/src/lib/util/cursor.c +++ b/src/lib/util/cursor.c @@ -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); diff --git a/src/lib/util/strerror.c b/src/lib/util/strerror.c index 8ac011459ab..5ab3a72ceea 100644 --- a/src/lib/util/strerror.c +++ b/src/lib/util/strerror.c @@ -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 ""; diff --git a/src/main/xlat_eval.c b/src/main/xlat_eval.c index 3ce3ea6646c..e0e76efce54 100644 --- a/src/main/xlat_eval.c +++ b/src/main/xlat_eval.c @@ -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; /* diff --git a/src/modules/rlm_expr/rlm_expr.c b/src/modules/rlm_expr/rlm_expr.c index 6b290bab2f6..d40df232a2d 100644 --- a/src/modules/rlm_expr/rlm_expr.c +++ b/src/modules/rlm_expr/rlm_expr.c @@ -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);