From: Alan T. DeKok Date: Sun, 17 Apr 2022 16:34:54 +0000 (-0400) Subject: align encode_array() with other protocols X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=648d5c88dccae30eb0530db31a15186780643ee0;p=thirdparty%2Ffreeradius-server.git align encode_array() with other protocols and remove yet another protocol-specific "get attr length" function --- diff --git a/src/protocols/dns/base.c b/src/protocols/dns/base.c index b25722d2084..bc28d24be84 100644 --- a/src/protocols/dns/base.c +++ b/src/protocols/dns/base.c @@ -368,44 +368,6 @@ next: return true; } - -/** Return the on-the-wire length of an attribute value - * - * @param[in] vp to return the length of. - * @return the length of the attribute. - */ -size_t fr_dns_value_len(fr_pair_t const *vp) -{ - switch (vp->vp_type) { - case FR_TYPE_VARIABLE_SIZE: -#ifndef NDEBUG - if (!vp->da->flags.extra && (vp->da->flags.subtype == FLAG_ENCODE_DNS_LABEL)) { - fr_assert_fail("DNS labels MUST be encoded/decoded with their own function, and not with generic 'string' functions"); - return 0; - } -#endif - - if (vp->da->flags.length) return vp->da->flags.length; /* Variable type with fixed length */ - - /* - * Arrays get maxed at 2^16-1 - */ - if (vp->da->flags.array && ((vp->vp_type == FR_TYPE_STRING) || (vp->vp_type == FR_TYPE_OCTETS))) { - if (vp->vp_length > 65535) return 65535; - } - - return vp->vp_length; - - case FR_TYPE_STRUCTURAL: - fr_assert_fail(NULL); - return 0; - - default: - return fr_value_box_network_length(&vp->data); - } -} - - fr_dns_labels_t *fr_dns_labels_get(uint8_t const *packet, size_t packet_len, bool init_mark) { fr_dns_labels_t *lb = &fr_dns_labels; diff --git a/src/protocols/dns/dns.h b/src/protocols/dns/dns.h index 0afd533faee..a03f8a1ed9e 100644 --- a/src/protocols/dns/dns.h +++ b/src/protocols/dns/dns.h @@ -143,8 +143,6 @@ bool fr_dns_packet_ok(uint8_t const *packet, size_t packet_len, bool query, fr_d fr_dns_labels_t *fr_dns_labels_get(uint8_t const *packet, size_t packet_len, bool init_mark); -size_t fr_dns_value_len(fr_pair_t const *vp); - ssize_t fr_dns_decode(TALLOC_CTX *ctx, fr_pair_list_t *out, uint8_t const *packet, size_t packet_len, fr_dns_ctx_t *packet_ctx); diff --git a/src/protocols/dns/encode.c b/src/protocols/dns/encode.c index 2e5c962163c..849eefc465f 100644 --- a/src/protocols/dns/encode.c +++ b/src/protocols/dns/encode.c @@ -252,77 +252,24 @@ static inline ssize_t encode_array(fr_dbuff_t *dbuff, fr_dcursor_t *cursor, void *encode_ctx) { ssize_t slen; - size_t element_len; fr_dbuff_t work_dbuff = FR_DBUFF(dbuff); fr_pair_t *vp; fr_dict_attr_t const *da = da_stack->da[depth]; - fr_dns_ctx_t *packet_ctx = encode_ctx; + + FR_PROTO_STACK_PRINT(da_stack, depth); if (!fr_cond_assert_msg(da->flags.array, "%s: Internal sanity check failed, attribute \"%s\" does not have array bit set", __FUNCTION__, da->name)) return PAIR_ENCODE_FATAL_ERROR; - /* - * DNS labels have internalized length, so we don't need - * length headers. - */ - if ((da->type == FR_TYPE_STRING) && !da->flags.extra && da->flags.subtype){ - while (fr_dbuff_extend(&work_dbuff)) { - vp = fr_dcursor_current(cursor); - - slen = fr_dns_label_from_value_box_dbuff(&work_dbuff, true, &vp->data, packet_ctx->lb); - if (slen <= 0) return PAIR_ENCODE_FATAL_ERROR; - - vp = fr_dcursor_next(cursor); - if (!vp || (vp->da != da)) break; /* Stop if we have an attribute of a different type */ - } - - return fr_dbuff_set(dbuff, &work_dbuff); - } - while (fr_dbuff_extend(&work_dbuff)) { - bool len_field = false; fr_dbuff_t element_dbuff = FR_DBUFF(&work_dbuff); - element_len = fr_dns_value_len(fr_dcursor_current(cursor)); - - /* - * If the data is variable length i.e. strings or octets - * we need to include a length field before each element. - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...-+-+-+-+-+-+-+ - * | text-len | String | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...-+-+-+-+-+-+-+ - */ - if (!da->flags.length) { - len_field = true; - FR_DBUFF_ADVANCE_RETURN(&element_dbuff, sizeof(uint16_t)); /* Make room for the length field */ - } - slen = encode_value(&element_dbuff, da_stack, depth, cursor, encode_ctx); if (slen < 0) return slen; - if (!fr_cond_assert(slen < UINT16_MAX)) return PAIR_ENCODE_FATAL_ERROR; - - /* - * Ensure we always create elements of the correct length. - * This is mainly for fixed length octets type attributes - * containing one or more keys. - */ - if (da->flags.length) { - if ((size_t)slen < element_len) { - FR_DBUFF_MEMSET_RETURN(&element_dbuff, 0, element_len - slen); - slen = element_len; - } else if ((size_t)slen > element_len){ - slen = element_len; - } - } - /* - * Populate the length field - */ - if (len_field) fr_dbuff_in(&work_dbuff, (uint16_t) slen); fr_dbuff_set(&work_dbuff, &element_dbuff); - vp = fr_dcursor_current(cursor); if (!vp || (vp->da != da)) break; /* Stop if we have an attribute of a different type */ }