]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
* Fix RR types NSAP-PTR, GPOS and RESINFO to print unquoted strings.
authorW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Tue, 1 Apr 2025 11:51:09 +0000 (13:51 +0200)
committerW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Tue, 1 Apr 2025 11:51:09 +0000 (13:51 +0200)
Changelog
host2str.c
ldns/host2str.h
ldns/rdata.h
rdata.c
rr.c
wire2host.c

index 19cfc4f114aec276534c0a4caa402932133c1bb3..c14a2957e7cb304173ceb7021ad68cdac84ace4a 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -16,6 +16,7 @@
        * Add ldns-verify-zone -s option. It checks all signature results,
          instead of passing by when one RRSIG validates. That prints output
          for spurious RRSIGs, the failures for them.
+       * Fix RR types NSAP-PTR, GPOS and RESINFO to print unquoted strings.
 
 1.8.4  2024-07-19
        * Fix building documentation in build directory.
index deeeaf634e6360ace92f84b79b1e265410a48759..f9dde7c6ab062b51574202af646eaafe2656de33 100644 (file)
@@ -1224,6 +1224,34 @@ ldns_rdf2buffer_str_eui64(ldns_buffer *output, const ldns_rdf *rdf)
        return ldns_buffer_status(output);
 }
 
+ldns_status
+ldns_rdf2buffer_str_unquoted(ldns_buffer *output, const ldns_rdf *rdf)
+{
+       size_t amount, i;
+       uint8_t ch;
+       if(ldns_rdf_size(rdf) < 1) {
+               return LDNS_STATUS_WIRE_RDATA_ERR;
+       }
+       if((int)ldns_rdf_size(rdf) < (int)ldns_rdf_data(rdf)[0] + 1) {
+               return LDNS_STATUS_WIRE_RDATA_ERR;
+       }
+       amount = ldns_rdf_data(rdf)[0];
+       for(i=0; i<amount; i++) {
+               ch = ldns_rdf_data(rdf)[1+i];
+               if (isprint((int)ch) || ch == '\t') {
+                       if (ch == '\"' || ch == '\\' || ch == '\'' ||
+                               ch == '(' || ch == ')' || isspace((int)ch))
+                               ldns_buffer_printf(output, "\\%c", ch);
+                       else
+                               ldns_buffer_printf(output, "%c", ch);
+               } else {
+                       ldns_buffer_printf(output, "\\%03u",
+                                (unsigned)(uint8_t) ch);
+               }
+       }
+       return ldns_buffer_status(output);
+}
+
 ldns_status
 ldns_rdf2buffer_str_tag(ldns_buffer *output, const ldns_rdf *rdf)
 {
@@ -1726,6 +1754,9 @@ ldns_rdf2buffer_str_fmt(ldns_buffer *buffer,
                case LDNS_RDF_TYPE_EUI64:
                        res = ldns_rdf2buffer_str_eui64(buffer, rdf);
                        break;
+               case LDNS_RDF_TYPE_UNQUOTED:
+                       res = ldns_rdf2buffer_str_unquoted(buffer, rdf);
+                       break;
                case LDNS_RDF_TYPE_TAG:
                        res = ldns_rdf2buffer_str_tag(buffer, rdf);
                        break;
index 79f5561a9451082e8eb2a2014e13c07a58ccf438..7cf919d5dd9bbd1c66e8e3e6d85347e7d86ebf43 100644 (file)
@@ -619,6 +619,16 @@ ldns_status ldns_rdf2buffer_str_eui48(ldns_buffer *output,
 ldns_status ldns_rdf2buffer_str_eui64(ldns_buffer *output,
                const ldns_rdf *rdf);
 
+/**
+ * Adds the LDNS_RDF_TYPE_UNQUOTED rdata to the output buffer,
+ * it escapes nonprinting and special characters.
+ * \param[in] *rdf The rdata to convert
+ * \param[in] *output The buffer to add the data to
+ * \return LDNS_STATUS_OK on success, and error status on failure
+ */
+ldns_status ldns_rdf2buffer_str_unquoted(ldns_buffer *output,
+               const ldns_rdf *rdf);
+
 /** 
  * Adds the LDNS_RDF_TYPE_TAG rdata to the output buffer,
  * provided it contains only alphanumeric characters.
index 1e2fd397a38ac099ec94ae641a90a90aa2927248..a93abf1ed91ef753043f10ffd3f6d1cae45f33dd 100644 (file)
@@ -120,6 +120,9 @@ enum ldns_enum_rdf_type
        /** 8 * 8 bit hex numbers separated by dashes. For EUI64. */
        LDNS_RDF_TYPE_EUI64,
 
+       /** Character string without quotes. */
+       LDNS_RDF_TYPE_UNQUOTED,
+
        /** A non-zero sequence of US-ASCII letters and numbers in lower case.
         *  For CAA.
         */
diff --git a/rdata.c b/rdata.c
index 3f899a217eb7f61b51f7dd9a426d0a1f93cdd56e..5cce57b0602df4ec2277110a897d229d7b5fd986 100644 (file)
--- a/rdata.c
+++ b/rdata.c
@@ -345,6 +345,9 @@ ldns_rdf_new_frm_str(ldns_rdf_type type, const char *str)
        case LDNS_RDF_TYPE_EUI64:
                status = ldns_str2rdf_eui64(&rdf, str);
                break;
+       case LDNS_RDF_TYPE_UNQUOTED:
+               status = ldns_str2rdf_str(&rdf, str);
+               break;
        case LDNS_RDF_TYPE_TAG:
                status = ldns_str2rdf_tag(&rdf, str);
                break;
diff --git a/rr.c b/rr.c
index 4be63b9e273eb4e3bee889ffe9d7dadc75e6de5b..53002749184575118ca81f727dbfd6a3de5a099f 100644 (file)
--- a/rr.c
+++ b/rr.c
@@ -1899,7 +1899,7 @@ static const ldns_rdf_type type_nsap_wireformat[] = {
        LDNS_RDF_TYPE_NSAP
 };
 static const ldns_rdf_type type_nsap_ptr_wireformat[] = {
-       LDNS_RDF_TYPE_STR
+       LDNS_RDF_TYPE_UNQUOTED
 };
 static const ldns_rdf_type type_sig_wireformat[] = {
        LDNS_RDF_TYPE_TYPE, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT32,
@@ -1913,7 +1913,7 @@ static const ldns_rdf_type type_px_wireformat[] = {
        LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME
 };
 static const ldns_rdf_type type_gpos_wireformat[] = {
-       LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR
+       LDNS_RDF_TYPE_UNQUOTED, LDNS_RDF_TYPE_UNQUOTED, LDNS_RDF_TYPE_UNQUOTED
 };
 static const ldns_rdf_type type_aaaa_wireformat[] = { LDNS_RDF_TYPE_AAAA };
 static const ldns_rdf_type type_loc_wireformat[] = { LDNS_RDF_TYPE_LOC };
@@ -2496,7 +2496,7 @@ static ldns_rr_descriptor rdata_field_descriptors[] = {
 #endif
 #ifdef RRTYPE_RESINFO
        /* 261 */
-       {LDNS_RR_TYPE_RESINFO, "RESINFO", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 },
+       {LDNS_RR_TYPE_RESINFO, "RESINFO", 1, 0, NULL, LDNS_RDF_TYPE_UNQUOTED, LDNS_RR_NO_COMPRESS, 0 },
 #else
 {LDNS_RR_TYPE_NULL, "TYPE261", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
 #endif
index 91d3f1364d750f33e5eb7be34831029f40b6e411..6829a287b80f3460dd35641420146469d255d73c 100644 (file)
@@ -230,6 +230,7 @@ ldns_wire2rdf(ldns_rr *rr, const uint8_t *wire, size_t max, size_t *pos)
                        break;
                case LDNS_RDF_TYPE_STR:
                case LDNS_RDF_TYPE_NSEC3_SALT:
+               case LDNS_RDF_TYPE_UNQUOTED:
                case LDNS_RDF_TYPE_TAG:
                        /* len is stored in first byte
                         * it should be in the rdf too, so just