]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
Correct sorting of rdata
authorWillem Toorop <willem@nlnetlabs.nl>
Wed, 2 Jun 2021 10:50:04 +0000 (12:50 +0200)
committerWillem Toorop <willem@nlnetlabs.nl>
Wed, 2 Jun 2021 10:50:04 +0000 (12:50 +0200)
sldns/str2wire.c

index 0053a757a49fa6969db4cb7b83a073bd1922bc27..5d3950fa7672233659e443a3bb4b970333d7572a 100644 (file)
@@ -625,31 +625,37 @@ static int sldns_str2wire_svcparam_key_cmp(const void *a, const void *b)
  */
 static int sldns_str2wire_check_svcbparams(uint8_t* rdata, uint16_t rdata_len)
 {
-       size_t nparams = 0, i, j;
-       uint8_t new_rdata[65536];
+       size_t   nparams = 0, i, j;
+       uint8_t  new_rdata[65536];
        uint8_t* new_rdata_ptr = new_rdata;
        uint8_t* svcparams[64];
        uint8_t* mandatory = NULL;
+       uint8_t* rdata_ptr = rdata;
+       uint16_t rdata_remaining = rdata_len;
 
        /* find the SvcParams */
-       while (rdata_len) {
+       while (rdata_remaining) {
                uint16_t svcbparam_len;
 
-               svcparams[nparams] = rdata;
-               if (rdata_len < 4)
+               svcparams[nparams] = rdata_ptr;
+               if (rdata_remaining < 4)
                        // @TODO verify that these are correct
                        return LDNS_WIREPARSE_ERR_OK;
-               svcbparam_len = sldns_read_uint16(rdata + 2);
-               rdata_len -= 4;
-               rdata += 4;
+               svcbparam_len = sldns_read_uint16(rdata_ptr + 2);
+               rdata_remaining -= 4;
+               rdata_ptr += 4;
 
-               if (rdata_len < svcbparam_len)
+               if (rdata_remaining < svcbparam_len)
                        // @TODO verify that these are correct
                        return LDNS_WIREPARSE_ERR_OK;
-               rdata_len -= svcbparam_len;
-               rdata += svcbparam_len;
+               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_OK;
        }
 
        /* In draft-ietf-dnsop-svcb-https-05 Section 7:
@@ -703,15 +709,15 @@ static int sldns_str2wire_check_svcbparams(uint8_t* rdata, uint16_t rdata_len)
 
        }
 
-       // Write rdata
+       // Write rdata in correct order
        for (i = 0; i < nparams; i++) {
-               uint16_t svcparam_len = sldns_read_uint16(svcparams[i] + 2) + 4;
-               fprintf(stderr, "svcparam_len: %d\n", svcparam_len);
+               uint16_t svcparam_len = sldns_read_uint16(svcparams[i] + 2)
+                                     + 2 * sizeof(uint16_t);
+
                memcpy(new_rdata_ptr, svcparams[i], svcparam_len);
                new_rdata_ptr += svcparam_len;
        }
-       memcpy(rdata, new_rdata, new_rdata_ptr - new_rdata);
-       fprintf(stderr, "new_rdata_ptr - new_rdata: %d\n", new_rdata_ptr - new_rdata);
+       memcpy(rdata, new_rdata, rdata_len);
 
        return LDNS_WIREPARSE_ERR_OK;
 }