]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Enforce is_const in the dcursor API
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Mon, 11 Oct 2021 20:19:42 +0000 (15:19 -0500)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Mon, 11 Oct 2021 20:19:42 +0000 (15:19 -0500)
Abort or return if a modification attempt is made on a const list

src/bin/unit_test_attribute.c
src/lib/util/dcursor.h
src/lib/util/pair.h
src/lib/util/pair_tokenize.c

index 39c333654bd4e2a1cabc95879c2cd76e1525facf..da29f47a4c253235a6d78f65e36ef97260f823c7 100644 (file)
@@ -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;
index 4d2517665289b3325447c42dd2b06fe9dc1e159a..3888a279219d77c6408363a78bd2650ce445c9ec 100644 (file)
@@ -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
         */
index 46cca33b7d879d26eea1a63dafbe10a4d42522d3..692ce9cf398931253d1bc1a68f56c79845fcfff9 100644 (file)
@@ -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);
index 004a8735e4b80068b459b2203c4a24f936dcc052..40614ca4403349b3a39dab3d4bdea584af6c7e84 100644 (file)
@@ -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;
 }