From: Vladimír Čunát Date: Wed, 12 May 2021 17:22:01 +0000 (+0200) Subject: lib/cache entry2answer(): trigger failures before jumps X-Git-Tag: v5.4.0~18^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7cc1a94485d838ac9122cbc4867b29d3157322dc;p=thirdparty%2Fknot-resolver.git lib/cache entry2answer(): trigger failures before jumps It's a little more verbose, but it should be more valuable in case we encounter them. --- diff --git a/lib/cache/entry_rr.c b/lib/cache/entry_rr.c index 02a7e79db..663bb6b04 100644 --- a/lib/cache/entry_rr.c +++ b/lib/cache/entry_rr.c @@ -76,9 +76,9 @@ int entry2answer(struct answer *ans, int id, const knot_dname_t *owner, uint16_t type, uint32_t new_ttl) { /* We assume it's zeroed. Do basic sanity check. */ - const bool not_ok = (ans->rrsets[id].set.rr || ans->rrsets[id].sig_rds.rdata + const bool not_ok = ans->rrsets[id].set.rr || ans->rrsets[id].sig_rds.rdata || (type == KNOT_RRTYPE_NSEC && ans->nsec_p.raw) - || (type == KNOT_RRTYPE_NSEC3 && !ans->nsec_p.raw)); + || (type == KNOT_RRTYPE_NSEC3 && !ans->nsec_p.raw); if (!kr_assume(!not_ok)) return kr_error(EINVAL); /* Materialize the base RRset. */ @@ -87,7 +87,7 @@ int entry2answer(struct answer *ans, int id, if (!kr_assume(rr)) return kr_error(ENOMEM); int ret = rdataset_materialize(&rr->rrs, eh->data, eh_bound, ans->mm); - if (ret < 0) goto fail; + if (!kr_assume(ret >= 0)) goto fail; size_t data_off = ret; ans->rrsets[id].set.rank = eh->rank; ans->rrsets[id].set.expiring = is_expiring(eh->ttl, new_ttl); @@ -96,20 +96,18 @@ int entry2answer(struct answer *ans, int id, if (want_rrsigs) { ret = rdataset_materialize(&ans->rrsets[id].sig_rds, eh->data + data_off, eh_bound, ans->mm); - if (ret < 0) goto fail; + if (!kr_assume(ret >= 0)) goto fail; /* Sanity check: we consumed exactly all data. */ int unused_bytes = eh_bound - (uint8_t *)eh->data - data_off - ret; - if (unused_bytes) { + if (!kr_assume(unused_bytes == 0)) { kr_log_error("[cach] entry2answer ERROR: unused bytes: %d\n", unused_bytes); - (void)!kr_assume(!EILSEQ); ret = kr_error(EILSEQ); goto fail; /* to be on the safe side */ } } return kr_ok(); fail: - (void)!kr_assume(!ret); /* Cleanup the item that we might've (partially) written to. */ knot_rrset_free(ans->rrsets[id].set.rr, ans->mm); knot_rdataset_clear(&ans->rrsets[id].sig_rds, ans->mm);