Skip to content
Snippets Groups Projects
Commit 2238603a authored by Vladimír Čunát's avatar Vladimír Čunát
Browse files

EDNS(0) padding: fixup nitpicks and minor issues

parent 632ace75
Branches
Tags
1 merge request!76Add EDNS(0) padding support
...@@ -112,7 +112,6 @@ struct query_flag { ...@@ -112,7 +112,6 @@ struct query_flag {
static const int BADCOOKIE_AGAIN = 1 << 22; static const int BADCOOKIE_AGAIN = 1 << 22;
static const int CNAME = 1 << 23; static const int CNAME = 1 << 23;
static const int REORDER_RR = 1 << 24; static const int REORDER_RR = 1 << 24;
static const int TLS = 1 << 25;
}; };
/* /*
......
...@@ -721,7 +721,7 @@ static int qr_task_step(struct qr_task *task, const struct sockaddr *packet_sour ...@@ -721,7 +721,7 @@ static int qr_task_step(struct qr_task *task, const struct sockaddr *packet_sour
task->addrlist = NULL; task->addrlist = NULL;
task->addrlist_count = 0; task->addrlist_count = 0;
task->addrlist_turn = 0; task->addrlist_turn = 0;
task->req.has_tls = (task->session && task->session->has_tls) ? true : false; task->req.has_tls = (task->session && task->session->has_tls);
int state = kr_resolve_consume(&task->req, packet_source, packet); int state = kr_resolve_consume(&task->req, packet_source, packet);
while (state == KNOT_STATE_PRODUCE) { while (state == KNOT_STATE_PRODUCE) {
state = kr_resolve_produce(&task->req, &task->addrlist, &sock_type, task->pktbuf); state = kr_resolve_produce(&task->req, &task->addrlist, &sock_type, task->pktbuf);
......
...@@ -340,31 +340,36 @@ static void write_extra_records(rr_array_t *arr, knot_pkt_t *answer) ...@@ -340,31 +340,36 @@ static void write_extra_records(rr_array_t *arr, knot_pkt_t *answer)
} }
} }
/** @internal Add an EDNS padding RR into the answer if requested and required. */
static int answer_padding(struct kr_request *request) static int answer_padding(struct kr_request *request)
{ {
if (!request || !request->answer || !request->ctx) {
assert(false);
return kr_error(EINVAL);
}
uint16_t padding = request->ctx->tls_padding; uint16_t padding = request->ctx->tls_padding;
knot_pkt_t *answer = request->answer; knot_pkt_t *answer = request->answer;
knot_rrset_t *opt_rr = answer->opt_rr; knot_rrset_t *opt_rr = answer->opt_rr;
if (padding < 2) { if (padding < 2) {
return true; return kr_ok();
} }
int32_t max_pad_bytes = knot_edns_get_payload(opt_rr) - (answer->size + knot_rrset_size(opt_rr)); int32_t max_pad_bytes = knot_edns_get_payload(opt_rr) - (answer->size + knot_rrset_size(opt_rr));
int32_t pad_bytes = MIN(knot_edns_alignment_size(answer->size, knot_rrset_size(opt_rr), padding), int32_t pad_bytes = MIN(knot_edns_alignment_size(answer->size, knot_rrset_size(opt_rr), padding),
max_pad_bytes); max_pad_bytes);
if (pad_bytes > 0) { if (pad_bytes >= 0) {
uint8_t zeros[pad_bytes]; uint8_t zeros[MAX(1, pad_bytes)];
memset(zeros, 0, sizeof(zeros)); memset(zeros, 0, sizeof(zeros));
int r = knot_edns_add_option(opt_rr, KNOT_EDNS_OPTION_PADDING, int r = knot_edns_add_option(opt_rr, KNOT_EDNS_OPTION_PADDING,
pad_bytes, zeros, &answer->mm); pad_bytes, zeros, &answer->mm);
if (r != KNOT_EOK) { if (r != KNOT_EOK) {
knot_rrset_clear(opt_rr, &answer->mm); knot_rrset_clear(opt_rr, &answer->mm);
return false; return kr_error(r);
} }
} }
return true; return kr_ok();
} }
static int answer_fail(struct kr_request *request) static int answer_fail(struct kr_request *request)
...@@ -377,7 +382,7 @@ static int answer_fail(struct kr_request *request) ...@@ -377,7 +382,7 @@ static int answer_fail(struct kr_request *request)
if (ret == 0 && answer->opt_rr) { if (ret == 0 && answer->opt_rr) {
/* OPT in SERVFAIL response is still useful for cookies/additional info. */ /* OPT in SERVFAIL response is still useful for cookies/additional info. */
knot_pkt_begin(answer, KNOT_ADDITIONAL); knot_pkt_begin(answer, KNOT_ADDITIONAL);
answer_padding(request); /* Ignore failed padding in SERVFAIL answer a*/ answer_padding(request); /* Ignore failed padding in SERVFAIL answer. */
ret = edns_put(answer); ret = edns_put(answer);
} }
return ret; return ret;
...@@ -408,7 +413,7 @@ static int answer_finalize(struct kr_request *request, int state) ...@@ -408,7 +413,7 @@ static int answer_finalize(struct kr_request *request, int state)
int ret = 0; int ret = 0;
if (answer->opt_rr) { if (answer->opt_rr) {
if (request->has_tls) { if (request->has_tls) {
if (!answer_padding(request)) { if (answer_padding(request) != kr_ok()) {
return answer_fail(request); return answer_fail(request);
} }
} }
......
...@@ -99,7 +99,7 @@ struct kr_context ...@@ -99,7 +99,7 @@ struct kr_context
* module because of better access. */ * module because of better access. */
struct kr_cookie_ctx cookie_ctx; struct kr_cookie_ctx cookie_ctx;
kr_cookie_lru_t *cache_cookie; kr_cookie_lru_t *cache_cookie;
uint32_t tls_padding; uint32_t tls_padding; /**< See net.tls_padding in ../daemon/README.rst */
knot_mm_t *pool; knot_mm_t *pool;
}; };
......
...@@ -49,8 +49,7 @@ ...@@ -49,8 +49,7 @@
X(STRICT, 1 << 21) /**< Strict resolver mode. */ \ X(STRICT, 1 << 21) /**< Strict resolver mode. */ \
X(BADCOOKIE_AGAIN, 1 << 22) /**< Query again because bad cookie returned. */ \ X(BADCOOKIE_AGAIN, 1 << 22) /**< Query again because bad cookie returned. */ \
X(CNAME, 1 << 23) /**< Query response contains CNAME in answer section. */ \ X(CNAME, 1 << 23) /**< Query response contains CNAME in answer section. */ \
X(REORDER_RR, 1 << 24) /**< Reorder cached RRs. */ \ X(REORDER_RR, 1 << 24) /**< Reorder cached RRs. */
X(TLS, 1 << 25) /**< Use TLS for this query. */
/** Query flags */ /** Query flags */
enum kr_query_flag { enum kr_query_flag {
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment