]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
hoist encode foreign ref to common function
authorAlan T. DeKok <aland@freeradius.org>
Sun, 28 Jan 2024 16:37:58 +0000 (11:37 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Sun, 28 Jan 2024 16:45:51 +0000 (11:45 -0500)
src/lib/util/encode.c
src/lib/util/encode.h
src/protocols/radius/encode.c

index e3c02218be8e9cd6a5f7c7c76da5c706feefa59d..7c35150c3ffe6bc600d79f0da822fec109718933 100644 (file)
@@ -108,3 +108,58 @@ ssize_t fr_pair_cursor_to_network(fr_dbuff_t *dbuff,
 
        return fr_dbuff_set(dbuff, &work_dbuff);
 }
+
+/** Encode a foreign reference to the network
+ *
+ * @param[out] dbuff           buffer to write the TLV to.
+ * @param[in] da_stack         Describing nesting of options.
+ * @param[in] depth            in the da_stack.
+ * @param[in,out] cursor       Current attribute we're encoding.
+ * @return
+ *     - >0 length of data encoded.
+ *     - 0 if we ran out of space.
+ *     - < 0 on error.
+ */
+ssize_t fr_pair_ref_to_network(fr_dbuff_t *dbuff, fr_da_stack_t *da_stack, unsigned int depth,
+                              fr_dcursor_t *cursor)
+{
+       ssize_t                 slen;
+       fr_dict_attr_t const    *da;
+       fr_pair_t const         *vp = fr_dcursor_current(cursor);
+       fr_dbuff_t              work_dbuff = FR_DBUFF(dbuff);
+
+       fr_dict_attr_t const *ref;
+       fr_dict_protocol_t const *proto;
+
+       FR_PROTO_STACK_PRINT(da_stack, depth);
+
+       da = da_stack->da[depth];
+       fr_assert(da->type == FR_TYPE_GROUP);
+
+       ref = fr_dict_attr_ref(da);
+       if (!ref) {
+               fr_strerror_printf("Invalid attribute reference for %s", da->name);
+               return PAIR_ENCODE_SKIPPED;
+       }
+
+       proto = fr_dict_protocol(ref->dict);
+       fr_assert(proto != NULL);
+
+       if (!proto->encode) {
+               fr_strerror_printf("Attribute %s -> %s does not have an encoder", da->name, ref->name);
+               return PAIR_ENCODE_SKIPPED;
+       }
+
+       /*
+        *      The foreign functions don't take a cursor, so we have to update the cursor ourselves.
+        */
+       slen = proto->encode(&work_dbuff, &vp->vp_group);
+       if (slen <= 0) return slen;
+
+       FR_PROTO_HEX_DUMP(fr_dbuff_start(&work_dbuff), fr_dbuff_used(&work_dbuff), "group ref");
+
+       vp = fr_dcursor_next(cursor);
+       fr_proto_da_stack_build(da_stack, vp ? vp->da : NULL);
+
+       return fr_dbuff_set(dbuff, &work_dbuff);
+}
index e4f86db5d4f1accf6e444cbf43ad65f3f77cfae4..cd61a117e083d42115ad9bb72e64b8f87b81307a 100644 (file)
@@ -46,6 +46,9 @@ ssize_t fr_pair_array_to_network(fr_dbuff_t *dbuff, fr_da_stack_t *da_stack, int
 ssize_t fr_pair_cursor_to_network(fr_dbuff_t *dbuff, fr_da_stack_t *da_stack, unsigned int depth,
                                  fr_dcursor_t *cursor, void *encode_ctx, fr_encode_dbuff_t encode_pair) CC_HINT(nonnull(1,2,4,6));
 
+ssize_t fr_pair_ref_to_network(fr_dbuff_t *dbuff, fr_da_stack_t *da_stack, unsigned int depth,
+                              fr_dcursor_t *cursor) CC_HINT(nonnull);
+
 #ifdef __cplusplus
 }
 #endif
index 7ef6ff184dc239cb89ed65217478ef0f7a261b92..ea096786c91b5636311aae253ad1f1c9af42ba71 100644 (file)
@@ -41,10 +41,6 @@ static ssize_t encode_child(fr_dbuff_t *dbuff,
                                fr_da_stack_t *da_stack, unsigned int depth,
                                fr_dcursor_t *cursor, void *encode_ctx);
 
-static ssize_t encode_group(fr_dbuff_t *dbuff,
-                           fr_da_stack_t *da_stack, unsigned int depth,
-                           fr_dcursor_t *cursor, void *encode_ctx);
-
 /** "encrypt" a password RADIUS style
  *
  * Input and output buffers can be identical if in-place encryption is needed.
@@ -353,7 +349,7 @@ static ssize_t encode_value(fr_dbuff_t *dbuff,
         */
        if (da->type == FR_TYPE_TLV) return encode_tlv(dbuff, da_stack, depth, cursor, encode_ctx);
 
-       if (da->type == FR_TYPE_GROUP) return encode_group(dbuff, da_stack, depth, cursor, encode_ctx);
+       if (da->type == FR_TYPE_GROUP) return fr_pair_ref_to_network(dbuff, da_stack, depth, cursor);
 
        /*
         *      Catch errors early on.
@@ -607,52 +603,6 @@ static ssize_t encode_value(fr_dbuff_t *dbuff,
        return fr_dbuff_set(dbuff, &work_dbuff);
 }
 
-static ssize_t encode_group(fr_dbuff_t *dbuff,
-                           fr_da_stack_t *da_stack, unsigned int depth,
-                           fr_dcursor_t *cursor, UNUSED void *encode_ctx)
-{
-       ssize_t                 slen;
-       fr_dict_attr_t const    *da;
-       fr_pair_t const         *vp = fr_dcursor_current(cursor);
-       fr_dbuff_t              work_dbuff = FR_DBUFF(dbuff);
-
-       fr_dict_attr_t const *ref;
-       fr_dict_protocol_t const *proto;
-
-       FR_PROTO_STACK_PRINT(da_stack, depth);
-
-       da = da_stack->da[depth];
-
-       ref = fr_dict_attr_ref(da);
-       if (!ref) {
-               fr_strerror_printf("Invalid attribute reference for %s", da->name);
-               return PAIR_ENCODE_SKIPPED;
-       }
-
-       fr_assert(ref->dict != dict_radius);
-
-       proto = fr_dict_protocol(ref->dict);
-       fr_assert(proto != NULL);
-
-       if (!proto->encode) {
-               fr_strerror_printf("Attribute %s -> %s does not have an encoder", da->name, ref->name);
-               return PAIR_ENCODE_SKIPPED;
-       }
-
-       /*
-        *      The foreign functions don't take a cursor, so we have to update the cursor ourselves.
-        */
-       slen = proto->encode(&work_dbuff, &vp->vp_group);
-       if (slen <= 0) return slen;
-
-       FR_PROTO_HEX_DUMP(fr_dbuff_start(&work_dbuff), fr_dbuff_used(&work_dbuff), "group ref");
-
-       vp = fr_dcursor_next(cursor);
-       fr_proto_da_stack_build(da_stack, vp ? vp->da : NULL);
-
-       return fr_dbuff_set(dbuff, &work_dbuff);
-}
-
 /** Breaks down large data into pieces, each with a header
  *
  * @param[out] data            we're fragmenting.