From: Alan T. DeKok Date: Wed, 6 Oct 2021 20:14:37 +0000 (-0400) Subject: add fr_strerror() and FR_PROTO_TRACE X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0176a487e5801cba68dd40349fef9cb05b423d06;p=thirdparty%2Ffreeradius-server.git add fr_strerror() and FR_PROTO_TRACE --- diff --git a/src/protocols/dns/decode.c b/src/protocols/dns/decode.c index acf9e0a8be..fbc463d92e 100644 --- a/src/protocols/dns/decode.c +++ b/src/protocols/dns/decode.c @@ -405,14 +405,11 @@ static ssize_t decode_dns_labels(TALLOC_CTX *ctx, fr_dcursor_t *cursor, fr_dict_ } static ssize_t decode_record(TALLOC_CTX *ctx, fr_dcursor_t *cursor, fr_dict_attr_t const *attr, - uint8_t const *packet, size_t packet_len, + uint8_t const *rr, uint8_t const *end, fr_dns_ctx_t *packet_ctx, uint8_t const *counter) { int i, count; - uint8_t const *p, *end; - - p = packet; - end = packet + packet_len; + uint8_t const *p = rr; count = fr_net_to_uint16(counter); FR_PROTO_TRACE("Decoding %u of %s", count, attr->name); @@ -422,17 +419,18 @@ static ssize_t decode_record(TALLOC_CTX *ctx, fr_dcursor_t *cursor, fr_dict_attr FR_PROTO_HEX_DUMP(p, end - p, "fr_dns_decode - %s %d/%d", attr->name, i, count); if (p >= end) { - FR_PROTO_TRACE("%s overflows packet at %d", attr->name, i); - return -(p - packet); + fr_strerror_printf("%s structure at count %d/%d overflows the packet", attr->name, i, count); + return -(p - rr); } slen = fr_struct_from_network(ctx, cursor, attr, p, end - p, true, packet_ctx, decode_value_trampoline, NULL); if (slen < 0) return slen; + if (!slen) break; p += slen; } - return p - packet; + return p - rr; } /** Decode a DNS packet @@ -443,8 +441,6 @@ ssize_t fr_dns_decode(TALLOC_CTX *ctx, uint8_t const *packet, size_t packet_len, ssize_t slen; uint8_t const *p, *end; - FR_PROTO_TRACE("HERE %d", __LINE__); - if (packet_len < DNS_HDR_LEN) return 0; /* @@ -459,28 +455,46 @@ ssize_t fr_dns_decode(TALLOC_CTX *ctx, uint8_t const *packet, size_t packet_len, slen = fr_struct_from_network(ctx, cursor, attr_dns_packet, packet, DNS_HDR_LEN, true, packet_ctx, decode_value_trampoline, NULL); if (slen < 0) { - fail: - fr_strerror_const("Failed decoding DNS packet"); + fr_strerror_printf("Failed decoding DNS header - %s", fr_strerror()); return slen; } + fr_assert(slen == DNS_HDR_LEN); p = packet + DNS_HDR_LEN; end = packet + packet_len; + FR_PROTO_HEX_DUMP(p, end - p, "fr_dns_decode - after header"); - slen = decode_record(ctx, cursor, attr_dns_question, p, end - p, packet_ctx, packet + 4); - if (slen < 0) goto fail; + slen = decode_record(ctx, cursor, attr_dns_question, p, end, packet_ctx, packet + 4); + if (slen < 0) { + fr_strerror_printf("Failed decoding questions - %s", fr_strerror()); + return slen; + } p += slen; + FR_PROTO_HEX_DUMP(p, end - p, "fr_dns_decode - after %zd bytes of questions", slen); - slen = decode_record(ctx, cursor, attr_dns_rr, p, end - p, packet_ctx, packet + 6); - if (slen < 0) goto fail; + slen = decode_record(ctx, cursor, attr_dns_rr, p, end, packet_ctx, packet + 6); + if (slen < 0) { + fr_strerror_printf("Failed decoding RRs - %s", fr_strerror()); + return slen - (p - packet); + } p += slen; + FR_PROTO_HEX_DUMP(p, end - p, "fr_dns_decode - after %zd bytes of RRs", slen); - slen = decode_record(ctx, cursor, attr_dns_ns, p, end - p, packet_ctx, packet + 8); - if (slen < 0) goto fail; + slen = decode_record(ctx, cursor, attr_dns_ns, p, end, packet_ctx, packet + 8); + if (slen < 0) { + fr_strerror_printf("Failed decoding NS - %s", fr_strerror()); + return slen - (p - packet); + } p += slen; + FR_PROTO_HEX_DUMP(p, end - p, "fr_dns_decode - after %zd bytes of NS", slen); + + slen = decode_record(ctx, cursor, attr_dns_ar, p, end, packet_ctx, packet + 10); + if (slen < 0) { + fr_strerror_printf("Failed decoding additional records - %s", fr_strerror()); + return slen - (p - packet); + } + FR_PROTO_HEX_DUMP(p, end - p, "fr_dns_decode - after %zd bytes of additional records", slen); - slen = decode_record(ctx, cursor, attr_dns_ar, p, end - p, packet_ctx, packet + 10); - if (slen < 0) goto fail; // p += slen; return packet_len;