]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add support for uncompressed dns labels
authorAlan T. DeKok <aland@freeradius.org>
Sat, 18 Nov 2023 19:18:47 +0000 (14:18 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Sat, 18 Nov 2023 19:18:47 +0000 (14:18 -0500)
src/protocols/dns/base.c
src/protocols/dns/dns.h
src/protocols/dns/encode.c

index e615777a56b386c56f78b4091f798dce05f261d9..06a748c689d75afa57d66d49f91ede39989605b9 100644 (file)
@@ -424,6 +424,7 @@ void fr_dns_global_free(void)
 
 static fr_table_num_ordered_t const subtype_table[] = {
        { L("dns_label"),                       FLAG_ENCODE_DNS_LABEL },
+       { L("uncompressed"),                    FLAG_ENCODE_DNS_LABEL_UNCOMPRESSED },
 };
 
 
index e4a2f45bbfa8187c46f9b8d3128b9403d38c58ab..2e4b952ae3a18c05745dde5954297cfd32f3a22c 100644 (file)
@@ -76,6 +76,7 @@ typedef struct {
 enum {
        FLAG_ENCODE_NONE = 0,                           //!< no particular encoding for DNS strings
        FLAG_ENCODE_DNS_LABEL,                          //!< encode as DNS label
+       FLAG_ENCODE_DNS_LABEL_UNCOMPRESSED,             //!< encode as uncompressed DNS label
 };
 
 typedef struct {
index ba782477a7a0937e7157f6dd0d6e07d15a532a76..6e88a094faaac725feb71deb768ab44d99111054 100644 (file)
@@ -149,13 +149,17 @@ static ssize_t encode_value(fr_dbuff_t *dbuff,
                /*
                 *      DNS labels get a special encoder.
                 */
-               if (!da->flags.extra && (da->flags.subtype == FLAG_ENCODE_DNS_LABEL)) {
+               if (!da->flags.extra) {
                        fr_dbuff_marker_t       last_byte, src;
 
+                       fr_assert((da->flags.subtype == FLAG_ENCODE_DNS_LABEL) ||
+                                 (da->flags.subtype == FLAG_ENCODE_DNS_LABEL_UNCOMPRESSED));
+
                        fr_dbuff_marker(&last_byte, &work_dbuff);
                        fr_dbuff_marker(&src, &work_dbuff);
                        FR_PROTO_TRACE("encode DNS label %s", vp->vp_strvalue);
-                       slen = fr_dns_label_from_value_box_dbuff(&work_dbuff, true, &vp->data, packet_ctx->lb);
+                       slen = fr_dns_label_from_value_box_dbuff(&work_dbuff, (da->flags.subtype == FLAG_ENCODE_DNS_LABEL),
+                                                                &vp->data, packet_ctx->lb);
                        if (slen < 0) return slen;
                        break;
                }