mirror of
https://github.com/NLnetLabs/unbound.git
synced 2026-08-29 03:09:51 +02:00
implement @wcawijngaards' review comments
This commit is contained in:
@@ -1226,7 +1226,7 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
|
||||
struct edns_option* backed_up_opt_list =
|
||||
qstate->edns_opts_back_out;
|
||||
struct edns_option* per_upstream_opt_list = NULL;
|
||||
struct edns_cookie* cookie;
|
||||
struct edns_cookie cookie;
|
||||
/* If we have an already populated EDNS option list make a copy
|
||||
* since we may now add upstream specific EDNS options. */
|
||||
if(qstate->edns_opts_back_out) {
|
||||
@@ -1256,20 +1256,20 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
|
||||
client_string_addr->string, qstate->region);
|
||||
}
|
||||
|
||||
if (qstate->env->cfg->upstream_cookies) {
|
||||
cookie = infra_get_cookie(env->infra_cache, addr, addrlen,
|
||||
zone, zonelen, *env->now);
|
||||
if (qstate->env->cfg->upstream_cookies &&
|
||||
infra_get_cookie(env->infra_cache, addr, addrlen,
|
||||
zone, zonelen, *env->now, &cookie)) {
|
||||
|
||||
if (cookie->state == SERVER_COOKIE_LEARNED) {
|
||||
if (cookie.state == SERVER_COOKIE_LEARNED) {
|
||||
/* We known the complete cookie, so we attach it */
|
||||
edns_opt_list_append(&per_upstream_opt_list,
|
||||
LDNS_EDNS_COOKIE, 24, cookie->data.complete,
|
||||
LDNS_EDNS_COOKIE, 24, cookie.data.cookie,
|
||||
qstate->region);
|
||||
} else if (cookie->state == SERVER_COOKIE_UNKNOWN) {
|
||||
} else if (cookie.state == SERVER_COOKIE_UNKNOWN) {
|
||||
/* We know just client cookie, so we attach it */
|
||||
edns_opt_list_append(&per_upstream_opt_list,
|
||||
LDNS_EDNS_COOKIE, 8,
|
||||
cookie->data.components.client,
|
||||
cookie.data.cookie,
|
||||
qstate->region);
|
||||
} /* We ignore COOKIE_NOT_SUPPORTED */
|
||||
}
|
||||
|
||||
+27
-11
@@ -1529,8 +1529,14 @@ match_random_client_cookie(uint8_t* query, size_t query_len)
|
||||
}
|
||||
|
||||
/* class + ttl + rdlen = 8 */
|
||||
if(walk_query_len <= 8) {
|
||||
verbose(3, "No edns opt, no cookie");
|
||||
if (walk_query_len <= 8) {
|
||||
verbose(3, "No correct EDNS record found, so no cookie");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* class + ttl + rdlen + opt_code + opt_len = 12 */
|
||||
if (walk_query_len < 12) {
|
||||
verbose(3, "No EDNS opt found, so no cookie");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1561,13 +1567,19 @@ match_random_complete_cookie(uint8_t* query, size_t query_len, struct entry* p)
|
||||
|
||||
/* class + ttl + rdlen = 8 */
|
||||
if(walk_query_len <= 8) {
|
||||
verbose(3, "No edns opt, no cookie");
|
||||
verbose(3, "No correct EDNS record , so no cookie");
|
||||
return 0;
|
||||
}
|
||||
|
||||
walk_query += 8;
|
||||
walk_query_len -= 8;
|
||||
|
||||
/* opt_code + opt_len = 4 */
|
||||
if (walk_query_len < 4) {
|
||||
verbose(3, "No EDNS opt found, so no cookie");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (sldns_read_uint16(walk_query) != 10 /* LDNS_EDNS_COOKIE */) {
|
||||
verbose(3, "EDNS option is not a cookie");
|
||||
return 0;
|
||||
@@ -1577,6 +1589,12 @@ match_random_complete_cookie(uint8_t* query, size_t query_len, struct entry* p)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* opt_code + opt_len + cookie_data = 28 */
|
||||
if (walk_query_len < 28) {
|
||||
verbose(3, "No complete cookie found in the packet");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (p->match_random_complete_cookie_renewed) {
|
||||
uint8_t renewed_cookie[16];
|
||||
|
||||
@@ -1881,18 +1899,16 @@ adjust_packet(struct entry* match, uint8_t** answer_pkt, size_t *answer_len,
|
||||
if (sldns_read_uint16(walk_query+2) == 8) {
|
||||
/* copy the EDNS client cookie from the query
|
||||
* packet to the response */
|
||||
memcpy(walk_response, walk_query, 12);
|
||||
memmove(walk_response, walk_query, 12);
|
||||
|
||||
/* add the server cookie to the client cookie to make it
|
||||
* 'complete'. we fake the siphash specified in RFC9018
|
||||
* by hardcoding the server cookie */
|
||||
memcpy(walk_response+12, hardcoded_server_cookie, 16);
|
||||
memmove(walk_response+12, hardcoded_server_cookie, 16);
|
||||
|
||||
/* update the RDLEN and OPTLEN */
|
||||
sldns_write_uint16(rdlen_ptr_response, 28);
|
||||
sldns_write_uint16(walk_response+2, 24);
|
||||
|
||||
reslen = origlen + 28;
|
||||
} else if (sldns_read_uint16(walk_query+2) == 24) {
|
||||
/* update the RDLEN */
|
||||
sldns_write_uint16(rdlen_ptr_response, 28);
|
||||
@@ -1903,11 +1919,11 @@ adjust_packet(struct entry* match, uint8_t** answer_pkt, size_t *answer_len,
|
||||
if (match->server_cookie_renew) {
|
||||
/* copy the cookie from the response but add a
|
||||
* different cookie (by reshuffeling server cookie) */
|
||||
memcpy(walk_response, walk_query, 12);
|
||||
memcpy(walk_response+12, walk_query+12+8, 8);
|
||||
memcpy(walk_response+12+8, walk_query+12, 8);
|
||||
memmove(walk_response, walk_query, 12);
|
||||
memmove(walk_response+12, walk_query+12+8, 8);
|
||||
memmove(walk_response+12+8, walk_query+12, 8);
|
||||
} else {
|
||||
memcpy(walk_response, walk_query, 28);
|
||||
memmove(walk_response, walk_query, 28);
|
||||
}
|
||||
} else {
|
||||
log_err("testbound: the incoming EDNS cookie has the wrong length");
|
||||
|
||||
@@ -529,6 +529,7 @@ infra_test(void)
|
||||
|
||||
infra_delete(slab);
|
||||
config_delete(cfg);
|
||||
ub_randfree(rnd);
|
||||
}
|
||||
|
||||
#include "util/random.h"
|
||||
|
||||
Reference in New Issue
Block a user