]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Remove dbuff encode wrappers
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Tue, 3 Nov 2020 20:16:40 +0000 (14:16 -0600)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Tue, 3 Nov 2020 20:16:40 +0000 (14:16 -0600)
17 files changed:
src/bin/unit_test_attribute.c
src/lib/eap/chbind.c
src/lib/eap_aka_sim/base.h
src/lib/eap_aka_sim/encode.c
src/lib/io/pair.h
src/modules/rlm_dhcpv4/rlm_dhcpv4.c
src/protocols/dhcpv4/base.c
src/protocols/dhcpv4/dhcpv4.h
src/protocols/dhcpv4/encode.c
src/protocols/dhcpv6/base.c
src/protocols/dhcpv6/dhcpv6.h
src/protocols/dhcpv6/encode.c
src/protocols/internal/encode.c
src/protocols/internal/internal.h
src/protocols/radius/base.c
src/protocols/radius/encode.c
src/protocols/radius/radius.h

index d6757829cfcfe06820c57b520c3bdc0f8f93ca29..5d6dbc50c143987d84e719ac0be401c893a89189 100644 (file)
@@ -1675,7 +1675,7 @@ static size_t command_encode_pair(command_result_t *result, command_file_ctx_t *
                                                     cc->tmpl_rules.dict_def ? cc->tmpl_rules.dict_def : cc->config->dict, fr_pair_t);
                     vp;
                     vp = fr_cursor_current(&cursor)) {
-                       slen = tp->func(enc_p, enc_end - enc_p, &cursor, encoder_ctx);
+                       slen = tp->func(&FR_DBUFF_TMP(enc_p, enc_end), &cursor, encoder_ctx);
                        cc->last_ret = slen;
 
                        if (truncate) DEBUG("%s[%d]: Iteration %zu - Result %zd%s%s",
index de50d13fa4f99ffd0228714932d0ea8a4af3cb23..4549966934528b521402f19e93d4b26c5cd2ce20 100644 (file)
@@ -99,7 +99,7 @@ static bool chbind_build_response(request_t *request, CHBIND_REQ *chbind)
                }
                if (vp->da == attr_message_authenticator) goto next;
 
-               slen = fr_radius_encode_pair(ptr, end - ptr, &cursor, NULL);
+               slen = fr_radius_encode_pair(&FR_DBUFF_TMP(ptr, end), &cursor, NULL);
                if (slen < 0) {
                        if (slen == PAIR_ENCODE_SKIPPED) goto next;
 
index 2677f61e1ad0f5b961bb0bea7610a73e95010101..6b04050a7354a14c76f734f5bfa3d0dad193f443 100644 (file)
@@ -254,7 +254,7 @@ int         fr_aka_sim_decode(request_t *request, fr_cursor_t *decoded, fr_dict_t const
 /*
  *     encode.c
  */
-ssize_t                fr_aka_sim_encode_pair(uint8_t *out, size_t outlen, fr_cursor_t *cursor, void *encoder_ctx);
+ssize_t                fr_aka_sim_encode_pair(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx);
 
 ssize_t                fr_aka_sim_encode(request_t *request, fr_pair_t *to_encode, void *encode_ctx);
 
index 390a5fe226cb0b62b1f015dc9fc5bc5a5ab1f80d..84806829e08110343f1976acdf321677487cdebe 100644 (file)
@@ -854,9 +854,9 @@ static ssize_t encode_tlv_hdr(uint8_t *out, size_t outlen,
        return p - out; /* AT_IV + AT_*(TLV) - Can't use total_len, doesn't include IV */
 }
 
-ssize_t fr_aka_sim_encode_pair(uint8_t *out, size_t outlen, fr_cursor_t *cursor, void *encoder_ctx)
+ssize_t fr_aka_sim_encode_pair(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx)
 {
-       fr_pair_t const *vp;
+       fr_pair_t const         *vp;
        ssize_t                 slen;
        size_t                  attr_len;
 
@@ -864,6 +864,9 @@ ssize_t fr_aka_sim_encode_pair(uint8_t *out, size_t outlen, fr_cursor_t *cursor,
        fr_dict_attr_t const    *da = NULL;
        fr_aka_sim_encode_ctx_t *packet_ctx = encoder_ctx;
 
+       uint8_t                 *out = fr_dbuff_start(dbuff);
+       size_t                  outlen = fr_dbuff_remaining(dbuff);
+
        if (!cursor || !out) return PAIR_ENCODE_FATAL_ERROR;
 
        CHECK_FREESPACE(outlen, 4);             /* Attributes lengths are always multiples of 4 */
@@ -1019,7 +1022,7 @@ ssize_t fr_aka_sim_encode(request_t *request, fr_pair_t *to_encode, void *encode
         */
        (void)fr_cursor_head(&cursor);
        while (fr_cursor_current(&cursor)) {
-               slen = fr_aka_sim_encode_pair(p, end - p, &cursor, packet_ctx);
+               slen = fr_aka_sim_encode_pair(&FR_DBUFF_TMP(p, end), &cursor, packet_ctx);
                if (slen < 0) {
                error:
                        talloc_free(buff);
index d8cbfcc3066a8d6012944f1e1fbcbca5f11832e2..7c1f5fee2bcb8cdfa97342c84f018cc514bcd0c4 100644 (file)
@@ -102,10 +102,7 @@ static inline bool fr_pair_encode_is_error(ssize_t slen)
  *
  * The cursor is used to track how many pairs there are remaining.
  *
- * @param[out] out             Where to write encoded data.  The encoding function should
- *                             not assume that this buffer has been initialised, and must
- *                             zero out any portions used for padding.
- * @param[in] outlen           The length of the buffer provided.
+ * @param[out] out             Where to write the encoded data.
  * @param[in] cursor           Cursor containing the list of attributes to process.
  * @param[in] encoder_ctx      Any encoder specific data such as secrets or configurables.
  * @return
@@ -116,7 +113,7 @@ static inline bool fr_pair_encode_is_error(ssize_t slen)
  *       integer that would be required to encode the attribute.
  *     - >0 - The number of bytes written to out.
  */
-typedef ssize_t (*fr_pair_encode_t)(uint8_t *out, size_t outlen, fr_cursor_t *cursor, void *encoder_ctx);
+typedef ssize_t (*fr_pair_encode_t)(fr_dbuff_t *out, fr_cursor_t *cursor, void *encoder_ctx);
 
 /** A generic interface for decoding fr_pair_ts
  *
index b248fa22260865cfcfc2d95a56b5027ae178d37b..cf4d3afcb7d9abdd8db2931f4d9843439404e2ef 100644 (file)
@@ -165,7 +165,7 @@ static xlat_action_t dhcpv4_encode_xlat(TALLOC_CTX *ctx, fr_cursor_t *out,
        if (!fr_cursor_head(cursor)) return XLAT_ACTION_DONE;   /* Nothing to encode */
 
        while (fr_cursor_filter_current(cursor, fr_dhcpv4_is_encodable, NULL)) {
-               len = fr_dhcpv4_encode_option(p, end - p, cursor,
+               len = fr_dhcpv4_encode_option(&FR_DBUFF_TMP(p, end), cursor,
                                              &(fr_dhcpv4_ctx_t){ .root = fr_dict_root(dict_dhcpv4) });
                if (len < 0) {
                        RPEDEBUG("DHCP option encoding failed");
index 9957d62eb6a80dce1f68516bf38ceed73f7e1259..22fbd6f9265c6a50fda2a0a4889e777f2f8a68ec 100644 (file)
@@ -507,7 +507,7 @@ ssize_t fr_dhcpv4_encode_dbuff(fr_dbuff_t *dbuff, dhcp_packet_t *original, int c
                        continue;
                }
 
-               len = fr_dhcpv4_encode_option_dbuff(&work_dbuff,
+               len = fr_dhcpv4_encode_option(&work_dbuff,
                                              &cursor, &(fr_dhcpv4_ctx_t){ .root = fr_dict_root(dict_dhcpv4) });
                if (len <= 0) break;
        };
index 8936ed6bf0f018e3033b2a3cca664b80dc164111..ee87d14dab1842c2bda36da68501d0dc7b738771 100644 (file)
@@ -162,9 +162,7 @@ ssize_t             fr_dhcpv4_decode_option(TALLOC_CTX *ctx, fr_cursor_t *cursor, fr_dict_t
 /*
  *     encode.c
  */
-ssize_t                fr_dhcpv4_encode_option(uint8_t *out, size_t outlen,
-                                       fr_cursor_t *cursor, void *encoder_ctx);
-ssize_t                fr_dhcpv4_encode_option_dbuff(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx);
+ssize_t                fr_dhcpv4_encode_option(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx);
 
 /*
  *     packet.c
index 462abe65f0239302f5c4f2d206bb2e4256bf56cc..e39ba31f182ef21b507966ee33fffcd1e8121469 100644 (file)
@@ -479,8 +479,7 @@ static ssize_t encode_vsio_hdr(fr_dbuff_t *dbuff,
 
 /** Encode a DHCP option and any sub-options.
  *
- * @param[out] out             Where to write encoded DHCP attributes.
- * @param[in] outlen           Length of out buffer.
+ * @param[out] dbuff           Where to write encoded DHCP attributes.
  * @param[in] cursor           with current VP set to the option to be encoded.
  *                             Will be advanced to the next option to encode.
  * @param[in] encoder_ctx      Containing DHCPv4 dictionary.
@@ -489,12 +488,7 @@ static ssize_t encode_vsio_hdr(fr_dbuff_t *dbuff,
  *     - < 0 error.
  *     - 0 not valid option for DHCP (skipping).
  */
-ssize_t fr_dhcpv4_encode_option(uint8_t *out, size_t outlen, fr_cursor_t *cursor, void *encoder_ctx)
-{
-       return fr_dhcpv4_encode_option_dbuff(&FR_DBUFF_TMP(out, outlen), cursor, encoder_ctx);
-}
-
-ssize_t fr_dhcpv4_encode_option_dbuff(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx)
+ssize_t fr_dhcpv4_encode_option(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx)
 {
        fr_pair_t               *vp;
        unsigned int            depth = 0;
index e17403be2a10af5149767967452bef38f5f438b4..2074f2f2cccbc3ec51602ec75409510d4cee35e7 100644 (file)
@@ -816,7 +816,7 @@ ssize_t     fr_dhcpv6_encode_dbuff(fr_dbuff_t *dbuff, uint8_t const *original, size_
 
        fr_cursor_talloc_iter_init(&cursor, &vps, fr_dhcpv6_next_encodable, dict_dhcpv6, fr_pair_t);
        while ((fr_dbuff_extend(dbuff) > 0) && (fr_cursor_current(&cursor) != NULL)) {
-               slen = fr_dhcpv6_encode_option_dbuff(dbuff, &cursor, &packet_ctx);
+               slen = fr_dhcpv6_encode_option(dbuff, &cursor, &packet_ctx);
                switch (slen) {
                case PAIR_ENCODE_SKIPPED:
                        continue;
index d872bc53ef1190ecb673b85f8df1bdd0912e6e73..7796fc45678ed8d451454619e20be0496e78a0d1 100644 (file)
@@ -157,8 +157,7 @@ void                fr_dhcpv6_global_free(void);
 /*
  *     encode.c
  */
-ssize_t                fr_dhcpv6_encode_option(uint8_t *out, size_t outlen, fr_cursor_t *cursor, void *encoder_ctx);
-ssize_t                fr_dhcpv6_encode_option_dbuff(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void * encoder_ctx);
+ssize_t                fr_dhcpv6_encode_option(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void * encoder_ctx);
 
 /*
  *     decode.c
index 0b3ed3127ebdff962932cb95510c0a84a14cb1a6..a52ea5b4c747afa3dd337aa0717fe9248daeaaf1 100644 (file)
@@ -109,7 +109,7 @@ static ssize_t encode_value(fr_dbuff_t *dbuff,
 {
        ssize_t                 slen;
        fr_dbuff_t              work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
-       fr_pair_t const *vp = fr_cursor_current(cursor);
+       fr_pair_t const         *vp = fr_cursor_current(cursor);
        fr_dict_attr_t const    *da = da_stack->da[depth];
 
        VP_VERIFY(vp);
@@ -217,7 +217,7 @@ static ssize_t encode_value(fr_dbuff_t *dbuff,
 
                if (vp->vp_length < (size_t)slen) {
                        FR_DBUFF_MEMCPY_IN_RETURN(&work_dbuff, (uint8_t const *)(vp->vp_ptr), vp->vp_length);
-                       FR_DBUFF_MEMSET_RETURN(&work_dbuff, 0, slen - vp->vp_length);
+                       FR_DBUFF_MEMSET_RETURN(&work_dbuff, 0x00, slen - vp->vp_length);
                } else {
                        FR_DBUFF_MEMCPY_IN_RETURN(&work_dbuff, (uint8_t const *)(vp->vp_ptr), (size_t) slen);
                }
@@ -330,7 +330,7 @@ static ssize_t encode_value(fr_dbuff_t *dbuff,
 
                        while (fr_cursor_current(&child_cursor) != NULL) {
                                child = fr_cursor_current(&child_cursor);
-                               slen = fr_dhcpv6_encode_option_dbuff(&work_dbuff, &child_cursor, encoder_ctx);
+                               slen = fr_dhcpv6_encode_option(&work_dbuff, &child_cursor, encoder_ctx);
                                if (slen == PAIR_ENCODE_SKIPPED) continue;
 
                                if (slen < 0) return PAIR_ENCODE_FATAL_ERROR;
@@ -765,8 +765,7 @@ static ssize_t encode_relay_message(fr_dbuff_t *dbuff,
 
 /** Encode a DHCPv6 option and any sub-options.
  *
- * @param[out] out             Where to write encoded DHCP attributes.
- * @param[in] outlen           Length of out buffer.
+ * @param[out] dbuff           Where to write encoded DHCP attributes.
  * @param[in] cursor           with current VP set to the option to be encoded.
  *                             Will be advanced to the next option to encode.
  * @param[in] encoder_ctx      containing parameters for the encoder.
@@ -774,12 +773,7 @@ static ssize_t encode_relay_message(fr_dbuff_t *dbuff,
  *     - > 0 length of data written.
  *     - < 0 error.
  */
-ssize_t fr_dhcpv6_encode_option(uint8_t *out, size_t outlen, fr_cursor_t *cursor, void *encoder_ctx)
-{
-       return fr_dhcpv6_encode_option_dbuff(&FR_DBUFF_TMP(out, outlen), cursor, encoder_ctx);
-}
-
-ssize_t fr_dhcpv6_encode_option_dbuff(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void * encoder_ctx)
+ssize_t fr_dhcpv6_encode_option(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void * encoder_ctx)
 {
        fr_pair_t               *vp;
        unsigned int            depth = 0;
index 7d90eeccbea89067795900ade924c456878112aa..34f0bed5a98160b6053b1f20d716d29751f61861 100644 (file)
@@ -36,8 +36,6 @@
 
 #include <talloc.h>
 
-static ssize_t fr_internal_encode_pair_dbuff(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx);
-
 /** We use the same header for all types
  *
  */
@@ -226,8 +224,8 @@ static ssize_t internal_encode(fr_dbuff_t *dbuff,
                     vp = fr_cursor_current(&children)) {
                        FR_PROTO_TRACE("encode ctx changed %s -> %s", da->name, vp->da->name);
 
-                       slen = fr_internal_encode_pair_dbuff(&FR_DBUFF_RESERVE(dbuff, sizeof(uint64_t) - 1),
-                                                            &children, encoder_ctx);
+                       slen = fr_internal_encode_pair(&FR_DBUFF_RESERVE(dbuff, sizeof(uint64_t) - 1),
+                                                      &children, encoder_ctx);
                        if (slen < 0) return slen;
                }
                fr_cursor_next(cursor);
@@ -283,7 +281,7 @@ static ssize_t internal_encode(fr_dbuff_t *dbuff,
  *     - 0 Nothing to encode (or attribute skipped).
  *     - <0 an error occurred.
  */
-static ssize_t fr_internal_encode_pair_dbuff(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx)
+ssize_t fr_internal_encode_pair(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx)
 {
        fr_pair_t               *vp;
        fr_da_stack_t           da_stack;
@@ -296,24 +294,6 @@ static ssize_t fr_internal_encode_pair_dbuff(fr_dbuff_t *dbuff, fr_cursor_t *cur
        return internal_encode(dbuff, &da_stack, 0, cursor, encoder_ctx);
 }
 
-/** Encode a data structure into an internal attribute
- *
- * This is the main entry point into the encoder.
- *
- * @param[out] out             Where to write encoded data.
- * @param[in] outlen           Length of the out buffer.
- * @param[in] cursor           Specifying attribute to encode.
- * @param[in] encoder_ctx      Additional data such as the shared secret to use.
- * @return
- *     - >0 The number of bytes written to out.
- *     - 0 Nothing to encode (or attribute skipped).
- *     - <0 an error occurred.
- */
-ssize_t fr_internal_encode_pair(uint8_t *out, size_t outlen, fr_cursor_t *cursor, void *encoder_ctx)
-{
-       return fr_internal_encode_pair_dbuff(&FR_DBUFF_TMP(out, outlen), cursor, encoder_ctx);
-}
-
 /*
  *     Test points
  */
index 5b522ddfbe9011742a52305a858000a44fb224fc..cf9a1861080ffad9cd28bbf9b49a158187e7bc0a 100644 (file)
@@ -42,7 +42,7 @@
  * @copyright 2020 The FreeRADIUS server project
  */
 
-ssize_t fr_internal_encode_pair(uint8_t *out, size_t outlen, fr_cursor_t *cursor, void *encoder_ctx);
+ssize_t fr_internal_encode_pair(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx);
 
 ssize_t fr_internal_decode_pair(TALLOC_CTX *ctx, fr_cursor_t *cursor, fr_dict_t const *dict,
                                uint8_t const *data, size_t data_len, void *decoder_ctx);
index 98f9b2bf89593f211e2211b6bdca1b06fd6f8135..085f68dfcb465d0a470543405cf31a82277e4571 100644 (file)
@@ -1030,7 +1030,7 @@ ssize_t fr_radius_encode_dbuff(fr_dbuff_t *dbuff, uint8_t const *original,
                /*
                 *      Encode an individual VP
                 */
-               slen = fr_radius_encode_pair_dbuff(&work_dbuff, &cursor, &packet_ctx);
+               slen = fr_radius_encode_pair(&work_dbuff, &cursor, &packet_ctx);
                if (slen < 0) {
                        if (slen == PAIR_ENCODE_SKIPPED) continue;
                        return slen;
index 56d57fd7b717e4e8949a5f0f75fb0bb272049641..caf0000c79d6c30053bfac5dda052887b31c2888 100644 (file)
@@ -345,7 +345,7 @@ static ssize_t encode_tags(fr_dbuff_t *dbuff, fr_pair_t *vps, void *encoder_ctx)
                /*
                 *      Encode an individual VP
                 */
-               slen = fr_radius_encode_pair_dbuff(dbuff, &cursor, encoder_ctx);
+               slen = fr_radius_encode_pair(dbuff, &cursor, encoder_ctx);
                if (slen < 0) {
                        if (slen == PAIR_ENCODE_SKIPPED) continue;
                        return slen;
@@ -1267,8 +1267,7 @@ static ssize_t encode_rfc_hdr(fr_dbuff_t *dbuff, fr_da_stack_t *da_stack, unsign
  * we use for tracking our TLV/VSA nesting and then calls the appropriate
  * dispatch function.
  *
- * @param[out] out             Where to write encoded data.
- * @param[in] outlen           Length of the out buffer.
+ * @param[out] dbuff           Where to write encoded data.
  * @param[in] cursor           Specifying attribute to encode.
  * @param[in] encoder_ctx      Additional data such as the shared secret to use.
  * @return
@@ -1276,14 +1275,9 @@ static ssize_t encode_rfc_hdr(fr_dbuff_t *dbuff, fr_da_stack_t *da_stack, unsign
  *     - 0 Nothing to encode (or attribute skipped).
  *     - <0 an error occurred.
  */
-ssize_t fr_radius_encode_pair(uint8_t *out, size_t outlen, fr_cursor_t *cursor, void *encoder_ctx)
+ssize_t fr_radius_encode_pair(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx)
 {
-       return fr_radius_encode_pair_dbuff(&FR_DBUFF_TMP(out, outlen), cursor, encoder_ctx);
-}
-
-ssize_t fr_radius_encode_pair_dbuff(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx)
-{
-       fr_pair_t const *vp;
+       fr_pair_t const         *vp;
        ssize_t                 len;
        fr_dbuff_t              work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff);
 
index ac79b1d487a1b17c6a19548b22933341aa452194..fc1cbb1d3ff9486e70726b25d8b0ddaa02bc732f 100644 (file)
@@ -194,9 +194,7 @@ void                fr_radius_encode_chap_password(uint8_t out[static 1 + RADIUS_CHAP_CHALLENG
                                               RADIUS_PACKET *packet, uint8_t id,
                                               char const *password, size_t password_len) CC_HINT(nonnull(1,2,4));
 
-ssize_t                fr_radius_encode_pair(uint8_t *out, size_t outlen, fr_cursor_t *cursor, void *encoder_ctx);
-
-ssize_t                fr_radius_encode_pair_dbuff(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx);
+ssize_t                fr_radius_encode_pair(fr_dbuff_t *dbuff, fr_cursor_t *cursor, void *encoder_ctx);
 
 /*
  *     protocols/radius/decode.c