#include <inttypes.h>
#include <stdio.h>
#include <fcntl.h>
-#include <assert.h>
#include <arpa/inet.h>
#include <libknot/rrtype/rdname.h>
#include <libknot/descriptor.h>
bool kr_rank_test(uint8_t rank, uint8_t kr_flag)
{
- assert(kr_rank_check(rank) && kr_rank_check(kr_flag));
+ if (!kr_assume(kr_rank_check(rank) && kr_rank_check(kr_flag)))
+ return false;
if (kr_flag == KR_RANK_AUTH) {
return rank & KR_RANK_AUTH;
}
- assert(!(kr_flag & KR_RANK_AUTH));
+ if (!kr_assume(!(kr_flag & KR_RANK_AUTH)))
+ return false;
/* The rest are exclusive values - exactly one has to be set. */
return (rank & ~KR_RANK_AUTH) == kr_flag;
}
(r)->state = layer.api->func(&layer, ##__VA_ARGS__); \
/* It's an easy mistake to return error code, for example. */ \
/* (though we could allow such an overload later) */ \
- if (unlikely(!kr_state_consistent((r)->state))) { \
- assert(!EINVAL); \
+ if (!kr_assume(kr_state_consistent((r)->state))) { \
(r)->state = KR_STATE_FAIL; \
} else \
if ((r)->state == KR_STATE_YIELD) { \
*/
static void randomized_qname_case(knot_dname_t * restrict qname, uint32_t secret)
{
- if (secret == 0) {
+ if (secret == 0)
+ return;
+ if (!kr_assume(qname))
return;
- }
- assert(qname);
const int len = knot_dname_size(qname) - 2; /* Skip first, last label. First is length, last is always root */
for (int i = 0; i < len; ++i) {
/* Note: this relies on the fact that correct label lengths
kr_make_query(qry, pkt);
break;
}
- assert(target[0]);
+ (void)!kr_assume(target[0]);
target = knot_wire_next_label(target, NULL);
}
kr_cache_commit(cache);
}
}
/* Write to packet. */
- assert(pkt->current == KNOT_ADDITIONAL);
+ if (!kr_assume(pkt->current == KNOT_ADDITIONAL))
+ return kr_error(EINVAL);
return knot_pkt_put(pkt, KNOT_COMPR_HINT_NONE, pkt->opt_rr, KNOT_PF_FREE);
}
for (size_t i = 0; i < arr->len; ++i) {
ranked_rr_array_entry_t * entry = arr->at[i];
- assert(!entry->in_progress);
+ (void)!kr_assume(!entry->in_progress);
if (!entry->to_wire) {
continue;
}
/** @internal Add an EDNS padding RR into the answer if requested and required. */
static int answer_padding(struct kr_request *request)
{
- if (!request || !request->answer || !request->ctx) {
- assert(false);
+ if (!kr_assume(request && request->answer && request->ctx))
return kr_error(EINVAL);
- }
if (!request->qsource.flags.tls) {
/* Not meaningful to pad without encryption. */
return kr_ok();
for (int psec = KNOT_ANSWER; psec <= KNOT_ADDITIONAL; ++psec) {
const ranked_rr_array_t *arr = selected[psec];
for (ssize_t i = 0; i < arr->len; ++i) {
- if (unlikely(arr->at[i]->to_wire)) {
- assert(false);
+ if (!kr_assume(!arr->at[i]->to_wire)) {
answer_fail(request);
return;
}
return request->answer;
const knot_pkt_t *qs_pkt = request->qsource.packet;
- assert(qs_pkt);
+ if (!kr_assume(qs_pkt))
+ goto fail;
// Find answer_max: limit on DNS wire length.
uint16_t answer_max;
const struct kr_request_qsource_flags *qs_flags = &request->qsource.flags;
- assert((qs_flags->tls || qs_flags->http) ? qs_flags->tcp : true);
+ if (!kr_assume((qs_flags->tls || qs_flags->http) ? qs_flags->tcp : true))
+ goto fail;
if (!request->qsource.addr || qs_flags->tcp) {
// not on UDP
answer_max = KNOT_WIRE_MAX_PKTSIZE;
knot_pkt_t *answer = request->answer =
knot_pkt_new(wire, answer_max, &request->pool);
if (!answer || knot_pkt_init_response(answer, qs_pkt) != 0) {
- assert(!answer); // otherwise we messed something up
+ (void)!kr_assume(!answer); // otherwise we messed something up
goto enomem;
}
if (!wire)
return request->answer;
enomem:
+fail:
request->state = KR_STATE_FAIL; // TODO: really combine with another flag?
return request->answer = NULL;
}
return KR_STATE_PRODUCE;
}
- assert(qry->flags.FORWARD);
+ if (!kr_assume(qry->flags.FORWARD))
+ return KR_STATE_FAIL;
if (!trust_anchors) {
qry->flags.AWAIT_CUT = false;
qry->flags.AWAIT_IPV6 = true;
} else {
qry->flags.AWAIT_IPV4 = true;
- }
+ }
}
return ret;
const struct sockaddr *src,
const struct sockaddr *dst)
{
- assert(req);
+ if (!kr_assume(req))
+ return false;
/* RFC7873 4.1 strongly requires server address. */
- if (!dst) {
+ if (!dst)
return false;
- }
struct kr_cookie_settings *clnt_sett = &req->ctx->cookie_ctx.clnt;
/* Cookies disabled or packet has no EDNS section. */
- if (!clnt_sett->enabled) {
+ if (!clnt_sett->enabled)
return true;
- }
/*
* RFC7873 4.1 recommends using also the client address. The matter is
type = SOCK_STREAM;
break;
default:
- assert(0);
+ (void)!kr_assume(false);
}
int state = request->state;
ITERATE_LAYERS(request, qry, checkout, packet, &transport->address.ip, type);