fr_dcursor_t cursor[]; //!< Stack of cursors.
} fr_dcursor_stack_t;
+#ifndef TALLOC_GET_TYPE_ABORT_NOOP
+#define VALIDATE(_item) if (cursor->dlist->type && (_item)) _talloc_get_type_abort(_item, cursor->dlist->type, __location__);
+#else
+#define VALIDATE(_item)
+#endif
+
/** Internal function to get the next item
*
* @param[in] cursor to operate on.
if (!cursor->iter) return (fr_dlist_head(cursor->dlist)); /* Fast path without custom iter */
current = fr_dlist_head(cursor->dlist);
- return cursor->iter(cursor->dlist, current, cursor->iter_uctx);
+ next = cursor->iter(cursor->dlist, current, cursor->iter_uctx);
+ VALIDATE(next);
+ return next;
}
-#ifndef TALLOC_GET_TYPE_ABORT_NOOP
- if (cursor->dlist->type) _talloc_get_type_abort(current, cursor->dlist->type, __location__);
-#endif
+ VALIDATE(current);
if (!cursor->iter) {
return fr_dlist_next(cursor->dlist, current); /* Fast path without custom iter */
* The iterator can just return what it was passed for curr
* if it just wants to advance by one.
*/
- return cursor->iter(cursor->dlist, next, cursor->iter_uctx);
+ next = cursor->iter(cursor->dlist, next, cursor->iter_uctx);
+ VALIDATE(next);
+ return next;
}
/** Copy cursor parameters and state.
cursor->current = fr_dlist_head(cursor->dlist);
+ VALIDATE(cursor->current);
+
return cursor->current;
}
cursor->prev = NULL;
}
+ VALIDATE(cursor->current);
+
return cursor->current;
}
cursor->current = dcursor_next(cursor, cursor->current);
cursor->prev = fr_dlist_prev(cursor->dlist, cursor->current);
+
+ VALIDATE(cursor->current);
+
return cursor->current;
}
*
* @hidecallergraph
*/
-static inline void * fr_dcursor_current(fr_dcursor_t *cursor)
+static inline void *fr_dcursor_current(fr_dcursor_t *cursor)
{
if (unlikely(!cursor)) return NULL;
+ VALIDATE(cursor->current);
+
return cursor->current;
}
if (fr_dlist_empty(cursor->dlist)) return NULL;
if (!item) return NULL;
+ VALIDATE(item);
+
/*
* Item must be in the dlist
*/
if (!fr_cond_assert_msg(!cursor->is_const, "attempting to modify const list")) return -1;
-#ifndef TALLOC_GET_TYPE_ABORT_NOOP
- if (cursor->dlist->type) _talloc_get_type_abort(v, cursor->dlist->type, __location__);
-#endif
+ VALIDATE(v);
if (cursor->insert) if ((ret = cursor->insert(cursor->dlist, v, cursor->mod_uctx)) < 0) return ret;
if (!fr_cond_assert_msg(!cursor->is_const, "attempting to modify const list")) return -1;
-#ifndef TALLOC_GET_TYPE_ABORT_NOOP
- if (cursor->dlist->type) _talloc_get_type_abort(v, cursor->dlist->type, __location__);
-#endif
+ VALIDATE(v);
if (cursor->insert) if ((ret = cursor->insert(cursor->dlist, v, cursor->mod_uctx)) < 0) return ret;
if (!fr_cond_assert_msg(!cursor->is_const, "attempting to modify const list")) return -1;
-#ifndef TALLOC_GET_TYPE_ABORT_NOOP
- if (cursor->dlist->type) _talloc_get_type_abort(v, cursor->dlist->type, __location__);
-#endif
+ VALIDATE(v);
if (!cursor->current) {
if (fr_dcursor_append(cursor, v) < 0) return -1;
v = cursor->current;
+ VALIDATE(v);
+
if (cursor->remove) if (cursor->remove(cursor->dlist, v, cursor->mod_uctx) < 0) return NULL;
p = fr_dcursor_list_prev_peek(cursor);
if (!fr_cond_assert_msg(!cursor->is_const, "attempting to modify const list")) return NULL;
+ VALIDATE(r);
+
/*
* Correct behaviour here is debatable
*/
return NULL;
}
p = fr_dcursor_list_prev_peek(cursor);
+ VALIDATE(p);
if (cursor->remove) if (cursor->remove(cursor->dlist, v, cursor->mod_uctx) < 0) return NULL;