diff --git a/modules/cookies/cookiemonster.c b/modules/cookies/cookiemonster.c index b6659bd96c1fc11e0a6faa5e16d8ab2d4d050fc8..c98761c46fbe666d0750526136fa274a6a193ab3 100644 --- a/modules/cookies/cookiemonster.c +++ b/modules/cookies/cookiemonster.c @@ -55,25 +55,23 @@ static const struct sockaddr *passed_server_sockaddr(const struct kr_request *re /** * Obtain pointer to server socket address that matches obtained cookie. - * @param sockaddr pointer to socket address to be set - * @param is_current set to true if the cookie was generate from current secret - * @param req resolution context - * @param cc client cookie from the response - * @param cc_len client cookie size - * @param clnt_sett client cookie settings structure - * @return kr_ok() if matching address found, error code else + * @param srvr_sa server socket address + * @param cc client cookie from the response + * @param cc_len client cookie size + * @param clnt_sett client cookie settings structure + * @retval 1 if cookie matches current settings + * @retval 0 if cookie matches recent settings + * @return -1 if cookie does not match + * @return -2 on any error */ -static int srvr_sockaddr_cc_check(const struct sockaddr **sockaddr, - bool *is_current, struct kr_request *req, +static int srvr_sockaddr_cc_check(const struct sockaddr *srvr_sa, const uint8_t *cc, uint16_t cc_len, const struct kr_cookie_settings *clnt_sett) { - assert(sockaddr && is_current && req && cc && cc_len && clnt_sett); + assert(cc && cc_len > 0 && clnt_sett); - const struct sockaddr *tmp_sockaddr = passed_server_sockaddr(req); - if (!tmp_sockaddr) { - /* Server did not provide information about source address. */ - return kr_error(EINVAL); + if (!srvr_sa) { + return -2; } const struct knot_cc_alg *cc_alg = NULL; @@ -83,27 +81,32 @@ static int srvr_sockaddr_cc_check(const struct sockaddr **sockaddr, /* The address must correspond with the client cookie. */ struct knot_cc_input input = { .clnt_sockaddr = NULL, /* Not supported yet. */ - .srvr_sockaddr = tmp_sockaddr, + .srvr_sockaddr = srvr_sa, .secret_data = clnt_sett->current.secr->data, .secret_len = clnt_sett->current.secr->size }; + cc_alg = kr_cc_alg_get(clnt_sett->current.alg_id); if (!cc_alg) { - kr_error(EINVAL); + return -2; } + int comp_ret = -1; /* Cookie does not match. */ int ret = knot_cc_check(cc, cc_len, &input, cc_alg); - bool have_current = (ret == KNOT_EOK); - cc_alg = kr_cc_alg_get(clnt_sett->recent.alg_id); - if ((ret != KNOT_EOK) && clnt_sett->recent.secr && cc_alg) { - input.secret_data = clnt_sett->recent.secr->data; - input.secret_len = clnt_sett->recent.secr->size; - ret = knot_cc_check(cc, cc_len, &input, cc_alg); - } if (ret == KNOT_EOK) { - *sockaddr = tmp_sockaddr; - *is_current = have_current; + comp_ret = 1; + } else { + cc_alg = kr_cc_alg_get(clnt_sett->recent.alg_id); + if (clnt_sett->recent.secr && cc_alg) { + input.secret_data = clnt_sett->recent.secr->data; + input.secret_len = clnt_sett->recent.secr->size; + ret = knot_cc_check(cc, cc_len, &input, cc_alg); + if (ret == KNOT_EOK) { + comp_ret = 0; + } + } } - return (ret == KNOT_EOK) ? kr_ok() : kr_error(EINVAL); + + return comp_ret; } /** @@ -189,18 +192,17 @@ static bool check_cookie_content_and_cache(const struct kr_cookie_settings *clnt assert(pkt_cc_len == KNOT_OPT_COOKIE_CLNT); /* Check server address against received client cookie. */ - const struct sockaddr *srvr_sockaddr = NULL; - bool returned_current = false; - ret = srvr_sockaddr_cc_check(&srvr_sockaddr, &returned_current, req, - pkt_cc, pkt_cc_len, clnt_sett); - if (ret != kr_ok()) { + const struct sockaddr *srvr_sockaddr = passed_server_sockaddr(req); + ret = srvr_sockaddr_cc_check(srvr_sockaddr, pkt_cc, pkt_cc_len, + clnt_sett); + if (ret < 0) { DEBUG_MSG(NULL, "%s\n", "could not match received cookie"); return false; } assert(srvr_sockaddr); /* Don't cache received cookies that don't match the current secret. */ - if (returned_current && + if ((ret == 1) && !is_cookie_cached(cache, srvr_sockaddr, pkt_cookie_opt)) { ret = kr_cookie_lru_set(cache, srvr_sockaddr, pkt_cookie_opt); if (ret != kr_ok()) {