]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
implement todos
authorTom Carpay <tom@nlnetlabs.nl>
Wed, 2 Jun 2021 14:26:30 +0000 (16:26 +0200)
committerTom Carpay <tom@nlnetlabs.nl>
Wed, 2 Jun 2021 14:26:30 +0000 (16:26 +0200)
sldns/str2wire.c
sldns/str2wire.h
sldns/wire2str.c

index e72037017078563d85dfd37ec5020b8ff3396db8..8e27d52aa7ab698bfa6941f3be27dd45e1797b5c 100644 (file)
@@ -639,23 +639,19 @@ static int sldns_str2wire_check_svcbparams(uint8_t* rdata, uint16_t rdata_len)
 
                svcparams[nparams] = rdata_ptr;
                if (rdata_remaining < 4)
-                       // @TODO verify that these are correct
                        return LDNS_WIREPARSE_ERR_GENERAL;
                svcbparam_len = sldns_read_uint16(rdata_ptr + 2);
                rdata_remaining -= 4;
                rdata_ptr += 4;
 
                if (rdata_remaining < svcbparam_len)
-                       // @TODO verify that these are correct
                        return LDNS_WIREPARSE_ERR_GENERAL;
                rdata_remaining -= svcbparam_len;
                rdata_ptr += svcbparam_len;
 
                nparams += 1;
                if (nparams > sizeof(svcparams))
-                       // @TODO Too many svcparams. Unbound allows only
-                       //       sizeof(svcparams) svcparams.
-                       return LDNS_WIREPARSE_ERR_GENERAL;
+                       return LDNS_WIREPARSE_ERR_SVCB_TOO_MANY_PARAMS;
        }
 
        /* In draft-ietf-dnsop-svcb-https-05 Section 7:
@@ -674,7 +670,7 @@ static int sldns_str2wire_check_svcbparams(uint8_t* rdata, uint16_t rdata_len)
         *
         * If they key has already been seen, we have a duplicate
         */
-       for (i = 0; i < nparams - 1; i++) {
+       for (i = 0; i < nparams; i++) {
                uint16_t key = sldns_read_uint16(svcparams[i]);
 
                if (i + 1 < nparams && key == sldns_read_uint16(svcparams[i+1]))
@@ -686,16 +682,17 @@ static int sldns_str2wire_check_svcbparams(uint8_t* rdata, uint16_t rdata_len)
 
        /* 4. verify that all the SvcParamKeys in mandatory are present */
        if (mandatory) {
-               /* divide by sizeof(uint16_t)*/
+
+               /* Divide by sizeof(uint16_t)*/
                uint16_t mandatory_len = sldns_read_uint16(mandatory + 2) >> 1;
 
-               // @TODO do we need this?
-               if (mandatory_len < 1)
-                       return LDNS_WIREPARSE_ERR_SVCB_MISSING_PARAM;
+               /* Guaranteed by sldns_str2wire_svcparam_key_value */
+               assert(mandatory_len > 0);
 
                for (i = 0; i < mandatory_len; i++) {
-                       // @TODO fix ugly math
-                       uint16_t mandatory_key = sldns_read_uint16(mandatory + 4 + i * 2);
+                       uint16_t mandatory_key = sldns_read_uint16(mandatory
+                                              + 2 * sizeof(uint16_t)
+                                              + i * sizeof(uint16_t));
                        uint8_t found = 0;
 
                        for (j = 0; j < nparams; j++) {
@@ -1333,6 +1330,12 @@ sldns_str2wire_svcbparam_mandatory(const char* val, uint8_t* rd, size_t* rd_len)
         */
        qsort((void *)(rd + 4), count, sizeof(uint16_t), sldns_network_uint16_cmp);
 
+       /* In draft-ietf-dnsop-svcb-https-05 Section 8
+        * automatically mandatory MUST NOT appear in its own value-list
+        */
+       if (sldns_read_uint16(rd + 4) == SVCB_KEY_MANDATORY)
+               return LDNS_WIREPARSE_ERR_SVCB_MANDATORY_IN_MANDATORY;
+
        /* Guarantee key uniqueness. After the sort we only need to
         * compare neighbours */
        if (count > 1) {
@@ -1340,12 +1343,6 @@ sldns_str2wire_svcbparam_mandatory(const char* val, uint8_t* rd, size_t* rd_len)
                        uint8_t* current_pos = (rd + 4 + (sizeof(uint16_t) * i));
                        uint16_t key = sldns_read_uint16(current_pos);
 
-                       /* In draft-ietf-dnsop-svcb-https-05 Section 8
-                        * automatically mandatory MUST NOT appear in its own value-list
-                        */
-                       if (key == SVCB_KEY_MANDATORY)
-                               return LDNS_WIREPARSE_ERR_SVCB_MANDATORY_IN_MANDATORY;
-
                        if (key == sldns_read_uint16(current_pos + 2)) {
                                return LDNS_WIREPARSE_ERR_SVCB_MANDATORY_DUPLICATE_KEY;
                        }
@@ -1355,29 +1352,19 @@ sldns_str2wire_svcbparam_mandatory(const char* val, uint8_t* rd, size_t* rd_len)
        return LDNS_WIREPARSE_ERR_OK;
 }
 
-static int
-sldns_str2wire_svcbparam_no_default_alpn(const char* val, uint8_t* rd, size_t* rd_len)
-{
-       if (*rd_len < 4)
-               return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL;
-
-       sldns_write_uint16(rd, SVCB_KEY_NO_DEFAULT_ALPN);
-       sldns_write_uint16(rd + 2, 0);
-       *rd_len = 4;
-
-       return LDNS_WIREPARSE_ERR_OK;
-}
-
 static int
 sldns_str2wire_svcbparam_ech_value(const char* val, uint8_t* rd, size_t* rd_len)
 {
        uint8_t buffer[LDNS_MAX_RDFLEN];
        int wire_len;
 
-       // @TODO fix this
-       // if(strcmp(b64, "0") == 0) {
-               /* single 0 represents empty buffer */
-       // }
+       /* single 0 represents empty buffer */
+       if(strcmp(val, "0") == 0) {
+               sldns_write_uint16(rd, SVCB_KEY_ECH);
+               sldns_write_uint16(rd + 2, 0);
+
+               return LDNS_WIREPARSE_ERR_OK;
+       }
 
        wire_len = sldns_b64_pton(val, buffer, LDNS_MAX_RDFLEN);
 
@@ -1523,10 +1510,7 @@ sldns_str2wire_svcparam_key_value(const char *key, size_t key_len,
        case SVCB_KEY_MANDATORY:
                return sldns_str2wire_svcbparam_mandatory(val, rd, rd_len);
        case SVCB_KEY_NO_DEFAULT_ALPN:
-
-               // @TODO is this superfluous now?
-
-               return sldns_str2wire_svcbparam_no_default_alpn(val, rd, rd_len);
+               return LDNS_WIREPARSE_ERR_SVCB_NO_DEFAULT_ALPN_VALUE;
        case SVCB_KEY_ECH:
                return sldns_str2wire_svcbparam_ech_value(val, rd, rd_len);
        case SVCB_KEY_ALPN:
index 62efe9229105f8607e319213e4ad4b7f2e72cabc..5fc096b3ec3e60669abf58886760ae480c6a39a3 100644 (file)
@@ -221,15 +221,17 @@ uint8_t* sldns_wirerr_get_rdatawl(uint8_t* rr, size_t len, size_t dname_len);
 #define LDNS_WIREPARSE_ERR_PARENTHESIS 372
 #define LDNS_WIREPARSE_ERR_SVCB_UNKNOWN_KEY 373
 #define LDNS_WIREPARSE_ERR_SVCB_MISSING_PARAM 374
-#define LDNS_WIREPARSE_ERR_SVCB_DUPLICATE_KEYS 375
-#define LDNS_WIREPARSE_ERR_SVCB_MANDATORY_TOO_MANY_KEYS 376
-#define LDNS_WIREPARSE_ERR_SVCB_MANDATORY_MISSING_PARAM 377
-#define LDNS_WIREPARSE_ERR_SVCB_MANDATORY_DUPLICATE_KEY 378
-#define LDNS_WIREPARSE_ERR_SVCB_MANDATORY_IN_MANDATORY 379
-#define LDNS_WIREPARSE_ERR_SVCB_PORT_UNKNOWN_KEY 380
-#define LDNS_WIREPARSE_ERR_SVCB_IPV4_TOO_MANY_KEYS 381
-#define LDNS_WIREPARSE_ERR_SVCB_IPV6_TOO_MANY_KEYS 382
-#define LDNS_WIREPARSE_ERR_SVCB_ALPN_KEY_TOO_LARGE 383
+#define LDNS_WIREPARSE_ERR_SVCB_TOO_MANY_PARAMS 375
+#define LDNS_WIREPARSE_ERR_SVCB_DUPLICATE_KEYS 376
+#define LDNS_WIREPARSE_ERR_SVCB_MANDATORY_TOO_MANY_KEYS 377
+#define LDNS_WIREPARSE_ERR_SVCB_MANDATORY_MISSING_PARAM 378
+#define LDNS_WIREPARSE_ERR_SVCB_MANDATORY_DUPLICATE_KEY 379
+#define LDNS_WIREPARSE_ERR_SVCB_MANDATORY_IN_MANDATORY 380
+#define LDNS_WIREPARSE_ERR_SVCB_PORT_UNKNOWN_KEY 381
+#define LDNS_WIREPARSE_ERR_SVCB_IPV4_TOO_MANY_KEYS 382
+#define LDNS_WIREPARSE_ERR_SVCB_IPV6_TOO_MANY_KEYS 383
+#define LDNS_WIREPARSE_ERR_SVCB_ALPN_KEY_TOO_LARGE 384
+#define LDNS_WIREPARSE_ERR_SVCB_NO_DEFAULT_ALPN_VALUE 385
 
 /**
  * Get reference to a constant string for the (parse) error.
index 48dc55a9877d3a3fd67df37d27256f375d8f7747..a7e6ebc9080464ef31063aaf9722fb709a5f6699 100644 (file)
@@ -150,9 +150,11 @@ static sldns_lookup_table sldns_wireparse_errors_data[] = {
        { LDNS_WIREPARSE_ERR_INCLUDE, "$INCLUDE directive was seen in the zone" },
        { LDNS_WIREPARSE_ERR_PARENTHESIS, "Parse error, parenthesis mismatch" },
        { LDNS_WIREPARSE_ERR_SVCB_UNKNOWN_KEY, "Unknown SvcParamKey"},
-       { LDNS_WIREPARSE_ERR_SVCB_MISSING_PARAM, "Value expected for SvcParam"},
+       { LDNS_WIREPARSE_ERR_SVCB_MISSING_PARAM, "SvcParam is missing a SvcParamValue"},
        { LDNS_WIREPARSE_ERR_SVCB_DUPLICATE_KEYS, "Duplicate SVCB key found"},
        { LDNS_WIREPARSE_ERR_SVCB_MANDATORY_TOO_MANY_KEYS, "Too many keys in mandatory" },
+       { LDNS_WIREPARSE_ERR_SVCB_TOO_MANY_PARAMS,
+               "Too many SvcParams. Unbound only allows 64 entries" },
        { LDNS_WIREPARSE_ERR_SVCB_MANDATORY_MISSING_PARAM,
                "Mandatory SvcParamKey is missing"},
        { LDNS_WIREPARSE_ERR_SVCB_MANDATORY_DUPLICATE_KEY,
@@ -166,7 +168,9 @@ static sldns_lookup_table sldns_wireparse_errors_data[] = {
        { LDNS_WIREPARSE_ERR_SVCB_IPV6_TOO_MANY_KEYS,
                "Too many IPv6 addresses in ipv6hint" },
        { LDNS_WIREPARSE_ERR_SVCB_ALPN_KEY_TOO_LARGE,
-               "alpn strings need to be smaller than 255 chars"},
+               "Alpn strings need to be smaller than 255 chars"},
+       { LDNS_WIREPARSE_ERR_SVCB_NO_DEFAULT_ALPN_VALUE,
+               "No-default-alpn should not have a value" },
        { 0, NULL }
 };
 sldns_lookup_table* sldns_wireparse_errors = sldns_wireparse_errors_data;