From: Arran Cudbard-Bell Date: Tue, 3 Nov 2020 20:16:40 +0000 (-0600) Subject: Remove dbuff encode wrappers X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=99208aeb8dfd297f71df3b06f1990c35c2dcc69e;p=thirdparty%2Ffreeradius-server.git Remove dbuff encode wrappers --- diff --git a/src/bin/unit_test_attribute.c b/src/bin/unit_test_attribute.c index d6757829cfc..5d6dbc50c14 100644 --- a/src/bin/unit_test_attribute.c +++ b/src/bin/unit_test_attribute.c @@ -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", diff --git a/src/lib/eap/chbind.c b/src/lib/eap/chbind.c index de50d13fa4f..45499669345 100644 --- a/src/lib/eap/chbind.c +++ b/src/lib/eap/chbind.c @@ -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; diff --git a/src/lib/eap_aka_sim/base.h b/src/lib/eap_aka_sim/base.h index 2677f61e1ad..6b04050a735 100644 --- a/src/lib/eap_aka_sim/base.h +++ b/src/lib/eap_aka_sim/base.h @@ -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); diff --git a/src/lib/eap_aka_sim/encode.c b/src/lib/eap_aka_sim/encode.c index 390a5fe226c..84806829e08 100644 --- a/src/lib/eap_aka_sim/encode.c +++ b/src/lib/eap_aka_sim/encode.c @@ -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); diff --git a/src/lib/io/pair.h b/src/lib/io/pair.h index d8cbfcc3066..7c1f5fee2bc 100644 --- a/src/lib/io/pair.h +++ b/src/lib/io/pair.h @@ -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 * diff --git a/src/modules/rlm_dhcpv4/rlm_dhcpv4.c b/src/modules/rlm_dhcpv4/rlm_dhcpv4.c index b248fa22260..cf4d3afcb7d 100644 --- a/src/modules/rlm_dhcpv4/rlm_dhcpv4.c +++ b/src/modules/rlm_dhcpv4/rlm_dhcpv4.c @@ -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"); diff --git a/src/protocols/dhcpv4/base.c b/src/protocols/dhcpv4/base.c index 9957d62eb6a..22fbd6f9265 100644 --- a/src/protocols/dhcpv4/base.c +++ b/src/protocols/dhcpv4/base.c @@ -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; }; diff --git a/src/protocols/dhcpv4/dhcpv4.h b/src/protocols/dhcpv4/dhcpv4.h index 8936ed6bf0f..ee87d14dab1 100644 --- a/src/protocols/dhcpv4/dhcpv4.h +++ b/src/protocols/dhcpv4/dhcpv4.h @@ -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 diff --git a/src/protocols/dhcpv4/encode.c b/src/protocols/dhcpv4/encode.c index 462abe65f02..e39ba31f182 100644 --- a/src/protocols/dhcpv4/encode.c +++ b/src/protocols/dhcpv4/encode.c @@ -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; diff --git a/src/protocols/dhcpv6/base.c b/src/protocols/dhcpv6/base.c index e17403be2a1..2074f2f2ccc 100644 --- a/src/protocols/dhcpv6/base.c +++ b/src/protocols/dhcpv6/base.c @@ -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; diff --git a/src/protocols/dhcpv6/dhcpv6.h b/src/protocols/dhcpv6/dhcpv6.h index d872bc53ef1..7796fc45678 100644 --- a/src/protocols/dhcpv6/dhcpv6.h +++ b/src/protocols/dhcpv6/dhcpv6.h @@ -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 diff --git a/src/protocols/dhcpv6/encode.c b/src/protocols/dhcpv6/encode.c index 0b3ed3127eb..a52ea5b4c74 100644 --- a/src/protocols/dhcpv6/encode.c +++ b/src/protocols/dhcpv6/encode.c @@ -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; diff --git a/src/protocols/internal/encode.c b/src/protocols/internal/encode.c index 7d90eeccbea..34f0bed5a98 100644 --- a/src/protocols/internal/encode.c +++ b/src/protocols/internal/encode.c @@ -36,8 +36,6 @@ #include -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 */ diff --git a/src/protocols/internal/internal.h b/src/protocols/internal/internal.h index 5b522ddfbe9..cf9a1861080 100644 --- a/src/protocols/internal/internal.h +++ b/src/protocols/internal/internal.h @@ -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); diff --git a/src/protocols/radius/base.c b/src/protocols/radius/base.c index 98f9b2bf895..085f68dfcb4 100644 --- a/src/protocols/radius/base.c +++ b/src/protocols/radius/base.c @@ -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; diff --git a/src/protocols/radius/encode.c b/src/protocols/radius/encode.c index 56d57fd7b71..caf0000c79d 100644 --- a/src/protocols/radius/encode.c +++ b/src/protocols/radius/encode.c @@ -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); diff --git a/src/protocols/radius/radius.h b/src/protocols/radius/radius.h index ac79b1d487a..fc1cbb1d3ff 100644 --- a/src/protocols/radius/radius.h +++ b/src/protocols/radius/radius.h @@ -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