implement @wcawijngaards' review comments

This commit is contained in:
TCY16
2022-07-20 16:36:58 +03:00
parent 0d3823f3b3
commit b5acecc1f6
6 changed files with 93 additions and 64 deletions
+27 -11
View File
@@ -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");