From: Arran Cudbard-Bell Date: Mon, 11 Oct 2021 20:19:42 +0000 (-0500) Subject: Enforce is_const in the dcursor API X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8ddce31b4d14aa0158b217f4da377feea670d72f;p=thirdparty%2Ffreeradius-server.git Enforce is_const in the dcursor API Abort or return if a modification attempt is made on a const list --- diff --git a/src/bin/unit_test_attribute.c b/src/bin/unit_test_attribute.c index 39c333654bd..da29f47a4c2 100644 --- a/src/bin/unit_test_attribute.c +++ b/src/bin/unit_test_attribute.c @@ -2015,13 +2015,11 @@ static size_t command_pair(command_result_t *result, command_file_ctx_t *cc, fr_pair_t *vp; fr_pair_list_t head; char *p, *end; - fr_dcursor_t cursor; fr_pair_list_init(&head); ctx.ctx = cc->tmp_ctx; ctx.parent = fr_dict_root(cc->tmpl_rules.dict_def); - ctx.cursor = &cursor; - fr_dcursor_init(&cursor, fr_pair_list_order(&head)); + ctx.list = &head; p = in; end = in + inlen; diff --git a/src/lib/util/dcursor.h b/src/lib/util/dcursor.h index 4d251766528..3888a279219 100644 --- a/src/lib/util/dcursor.h +++ b/src/lib/util/dcursor.h @@ -206,7 +206,7 @@ static inline void *fr_dcursor_tail(fr_dcursor_t *cursor) * * @hidecallergraph */ -static inline void * CC_HINT(hot) fr_dcursor_next(fr_dcursor_t *cursor) +static inline void * fr_dcursor_next(fr_dcursor_t *cursor) { if (!cursor || fr_dlist_empty(cursor->dlist)) return NULL; cursor->current = dcursor_next(cursor, cursor->current); @@ -283,7 +283,7 @@ static inline void *fr_dcursor_list_prev_peek(fr_dcursor_t *cursor) * * @hidecallergraph */ -static inline void * CC_HINT(hot) fr_dcursor_current(fr_dcursor_t *cursor) +static inline void * fr_dcursor_current(fr_dcursor_t *cursor) { if (unlikely(!cursor)) return NULL; @@ -300,9 +300,11 @@ static inline void * CC_HINT(hot) fr_dcursor_current(fr_dcursor_t *cursor) * * @hidecallergraph */ -static inline void * CC_HINT(hot) fr_dcursor_set_current(fr_dcursor_t *cursor, void *item) +static inline void * fr_dcursor_set_current(fr_dcursor_t *cursor, void *item) { - if (!cursor || fr_dlist_empty(cursor->dlist)) return NULL; + if (!fr_cond_assert_msg(!cursor->is_const, "attempting to modify const list")) return NULL; + + if (fr_dlist_empty(cursor->dlist)) return NULL; if (!item) return NULL; cursor->current = item; @@ -323,8 +325,10 @@ static inline void * CC_HINT(hot) fr_dcursor_set_current(fr_dcursor_t *cursor, v * * @hidecallergraph */ -static inline void CC_HINT(hot) fr_dcursor_prepend(fr_dcursor_t *cursor, void *v) +static inline void fr_dcursor_prepend(fr_dcursor_t *cursor, void *v) { + if (!fr_cond_assert_msg(!cursor->is_const, "attempting to modify const list")) return; + #ifndef TALLOC_GET_TYPE_ABORT_NOOP if (cursor->dlist->type) _talloc_get_type_abort(v, cursor->dlist->type, __location__); #endif @@ -353,8 +357,10 @@ static inline void CC_HINT(hot) fr_dcursor_prepend(fr_dcursor_t *cursor, void *v * * @hidecallergraph */ -static inline void CC_HINT(hot) fr_dcursor_append(fr_dcursor_t *cursor, void *v) +static inline void fr_dcursor_append(fr_dcursor_t *cursor, void *v) { + if (!fr_cond_assert_msg(!cursor->is_const, "attempting to modify const list")) return; + #ifndef TALLOC_GET_TYPE_ABORT_NOOP if (cursor->dlist->type) _talloc_get_type_abort(v, cursor->dlist->type, __location__); #endif @@ -373,6 +379,8 @@ static inline void CC_HINT(hot) fr_dcursor_append(fr_dcursor_t *cursor, void *v) */ static inline void fr_dcursor_insert(fr_dcursor_t *cursor, void *v) { + if (!fr_cond_assert_msg(!cursor->is_const, "attempting to modify const list")) return; + #ifndef TALLOC_GET_TYPE_ABORT_NOOP if (cursor->dlist->type) _talloc_get_type_abort(v, cursor->dlist->type, __location__); #endif @@ -409,10 +417,12 @@ static inline void fr_dcursor_insert(fr_dcursor_t *cursor, void *v) * * @hidecallergraph */ -static inline void * CC_HINT(hot) fr_dcursor_remove(fr_dcursor_t *cursor) +static inline void * fr_dcursor_remove(fr_dcursor_t *cursor) { void *v, *p; + if (!fr_cond_assert_msg(!cursor->is_const, "attempting to modify const list")) return NULL; + if (!cursor->current) return NULL; /* don't do anything fancy, it's just a noop */ v = cursor->current; @@ -452,6 +462,9 @@ static inline void fr_dcursor_merge(fr_dcursor_t *cursor, fr_dcursor_t *to_appen { void *v, *p; + if (!fr_cond_assert_msg(!cursor->is_const, "dst list in merge is const")) return; + if (!fr_cond_assert_msg(!to_append->is_const, "src list in merge is const")) return; + p = cursor->current; while ((v = fr_dcursor_remove(to_append))) { fr_dcursor_insert(cursor, v); @@ -538,10 +551,12 @@ void *fr_dcursor_intersect_next(fr_dcursor_t *a, fr_dcursor_t *b) CC_HINT(nonnul * * @hidecallergraph */ -static inline void * CC_HINT(hot) fr_dcursor_replace(fr_dcursor_t *cursor, void *r) +static inline void * fr_dcursor_replace(fr_dcursor_t *cursor, void *r) { void *v, *p; + if (!fr_cond_assert_msg(!cursor->is_const, "attempting to modify const list")) return NULL; + /* * Correct behaviour here is debatable */ diff --git a/src/lib/util/pair.h b/src/lib/util/pair.h index 46cca33b7d8..692ce9cf398 100644 --- a/src/lib/util/pair.h +++ b/src/lib/util/pair.h @@ -506,7 +506,7 @@ void fr_pair_list_afrom_box(TALLOC_CTX *ctx, fr_pair_list_t *out, typedef struct { TALLOC_CTX *ctx; //!< to allocate VPs in fr_dict_attr_t const *parent; //!< current attribute to allocate VPs in - fr_dcursor_t *cursor; //!< of VPs to add + fr_pair_list_t *list; //!< of VPs to add } fr_pair_ctx_t; ssize_t fr_pair_ctx_afrom_str(fr_pair_ctx_t *pair_ctx, char const *in, size_t inlen) CC_HINT(nonnull); diff --git a/src/lib/util/pair_tokenize.c b/src/lib/util/pair_tokenize.c index 004a8735e4b..40614ca4403 100644 --- a/src/lib/util/pair_tokenize.c +++ b/src/lib/util/pair_tokenize.c @@ -264,7 +264,7 @@ static ssize_t fr_pair_afrom_str(fr_pair_ctx_t *pair_ctx, char const *start, cha vp = fr_pair_afrom_fields(pair_ctx->ctx, da, op, value, value_len, quote); if (!vp) return -(in - start); - fr_dcursor_append(pair_ctx->cursor, vp); + fr_pair_append(pair_ctx->list, vp); return p - start; }