From: Oto Šťáva Date: Wed, 15 May 2024 12:46:00 +0000 (+0200) Subject: daemon, lib, modules: trivial fixes for Coverity issues X-Git-Tag: v6.0.8~19^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fenvironments%2Fdocs-develop-cove-uiak3c%2Fdeployments%2F4083;p=thirdparty%2Fknot-resolver.git daemon, lib, modules: trivial fixes for Coverity issues --- diff --git a/daemon/bindings/event.c b/daemon/bindings/event.c index 686e33e9d..7e14dcd66 100644 --- a/daemon/bindings/event.c +++ b/daemon/bindings/event.c @@ -59,12 +59,12 @@ static int event_sched(lua_State *L, unsigned timeout, unsigned repeat) /* Start timer with the reference */ uv_loop_t *loop = uv_default_loop(); - uv_timer_init(loop, timer); - int ret = uv_timer_start(timer, event_callback, timeout, repeat); - if (ret != 0) { - free(timer); - lua_error_p(L, "couldn't start the event"); - } + int ret = uv_timer_init(loop, timer); + if (ret != 0) + goto exit_err; + ret = uv_timer_start(timer, event_callback, timeout, repeat); + if (ret != 0) + goto exit_err; /* Save callback and timer in registry */ lua_newtable(L); @@ -78,6 +78,10 @@ static int event_sched(lua_State *L, unsigned timeout, unsigned repeat) timer->data = (void *) (intptr_t)ref; lua_pushinteger(L, ref); return 1; + +exit_err: + free(timer); + lua_error_p(L, "couldn't start the event"); } static int event_after(lua_State *L) diff --git a/daemon/io.c b/daemon/io.c index a32f5a3fe..5ed2ef78a 100644 --- a/daemon/io.c +++ b/daemon/io.c @@ -40,7 +40,7 @@ static void check_bufsize(uv_handle_t* handle) * This is magic presuming we can pull in a whole recvmmsg width in one wave. * Linux will double this the bufsize wanted. */ - const int BUF_SIZE = 2 * sizeof(RECVMMSG_BATCH * KNOT_WIRE_MAX_PKTSIZE); + const int BUF_SIZE = 2 * RECVMMSG_BATCH * KNOT_WIRE_MAX_PKTSIZE; negotiate_bufsize(uv_recv_buffer_size, handle, BUF_SIZE); negotiate_bufsize(uv_send_buffer_size, handle, BUF_SIZE); } diff --git a/daemon/session2.c b/daemon/session2.c index c3d5765a9..566ff0c0a 100644 --- a/daemon/session2.c +++ b/daemon/session2.c @@ -1400,27 +1400,30 @@ static int session2_transport_pushv(struct session2 *s, .baton = baton, .comm = comm }; + int err_ret = kr_ok(); switch (s->transport.type) { case SESSION2_TRANSPORT_IO:; uv_handle_t *handle = s->transport.io.handle; if (kr_fails_assert(handle)) { - if (cb) - cb(kr_error(EINVAL), s, comm, baton); - free(ctx); - return kr_error(EINVAL); + err_ret = kr_error(EINVAL); + goto exit_err; } if (handle->type == UV_UDP) { if (ENABLE_SENDMMSG && !s->outgoing) { int fd; int ret = uv_fileno(handle, &fd); - if (kr_fails_assert(!ret)) - return kr_error(EIO); + if (kr_fails_assert(!ret)) { + err_ret = kr_error(EIO); + goto exit_err; + } /* TODO: support multiple iovecs properly? */ - if (kr_fails_assert(iovcnt == 1)) - return kr_error(EINVAL); + if (kr_fails_assert(iovcnt == 1)) { + err_ret = kr_error(EINVAL); + goto exit_err; + } session2_transport_pushv_ensure_long_lived( &iov, &iovcnt, iov_short_lived, @@ -1467,12 +1470,16 @@ static int session2_transport_pushv(struct session2 *s, #if ENABLE_XDP } else if (handle->type == UV_POLL) { xdp_handle_data_t *xhd = handle->data; - if (kr_fails_assert(xhd && xhd->socket)) - return kr_error(EIO); + if (kr_fails_assert(xhd && xhd->socket)) { + err_ret = kr_error(EIO); + goto exit_err; + } /* TODO: support multiple iovecs properly? */ - if (kr_fails_assert(iovcnt == 1)) - return kr_error(EINVAL); + if (kr_fails_assert(iovcnt == 1)) { + err_ret = kr_error(EINVAL); + goto exit_err; + } session2_transport_pushv_ensure_long_lived( &iov, &iovcnt, iov_short_lived, @@ -1505,17 +1512,15 @@ static int session2_transport_pushv(struct session2 *s, #endif } else { kr_assert(false && "Unsupported handle"); - if (cb) - cb(kr_error(EINVAL), s, comm, baton); - free(ctx); - return kr_error(EINVAL); + err_ret = kr_error(EINVAL); + goto exit_err; } case SESSION2_TRANSPORT_PARENT:; struct session2 *parent = s->transport.parent; if (kr_fails_assert(parent)) { - free(ctx); - return kr_error(EINVAL); + err_ret = kr_error(EINVAL); + goto exit_err; } int ret = session2_wrap(parent, protolayer_iovec(iov, iovcnt, iov_short_lived), @@ -1525,9 +1530,13 @@ static int session2_transport_pushv(struct session2 *s, default: kr_assert(false && "Invalid transport"); - free(ctx); - return kr_error(EINVAL); + err_ret = kr_error(EINVAL); + goto exit_err; } + +exit_err: + session2_transport_pushv_finished(err_ret, ctx); + return err_ret; } struct push_ctx { diff --git a/daemon/tls_ephemeral_credentials.c b/daemon/tls_ephemeral_credentials.c index 768942bb3..712e355b1 100644 --- a/daemon/tls_ephemeral_credentials.c +++ b/daemon/tls_ephemeral_credentials.c @@ -91,7 +91,7 @@ static gnutls_x509_privkey_t get_ephemeral_privkey (void) } data.size = stat.st_size; bytes_read = read(datafd, data.data, stat.st_size); - if (bytes_read != stat.st_size) { + if (bytes_read < 0 || bytes_read != stat.st_size) { kr_log_error(TLS, "unable to read ephemeral private key\n"); goto bad_data; } diff --git a/lib/rules/api.c b/lib/rules/api.c index ca0268797..c10cbb0b1 100644 --- a/lib/rules/api.c +++ b/lib/rules/api.c @@ -91,7 +91,7 @@ int kr_rule_tag_add(const char *tag, kr_rule_tags_t *tagset) kr_log_error(RULES, "ERROR: invalid length: %d\n", (int)val.len); return kr_error(EILSEQ); } - *tagset |= (1 << *tindex_p); + *tagset |= ((kr_rule_tags_t)1 << *tindex_p); return kr_ok(); } else if (ret != kr_error(ENOENT)) { return ret; @@ -114,7 +114,7 @@ int kr_rule_tag_add(const char *tag, kr_rule_tags_t *tagset) int ix = ffsll(~bmp) - 1; if (ix < 0 || ix >= 8 * sizeof(bmp)) return kr_error(E2BIG); - const kr_rule_tags_t tag_new = 1 << ix; + const kr_rule_tags_t tag_new = (kr_rule_tags_t)1 << ix; kr_require((tag_new & bmp) == 0); // Update the bitmap. ATM ruledb does not overwrite, so we `remove` before `write`. diff --git a/lib/rules/zonefile.c b/lib/rules/zonefile.c index cfd2bc276..74a7317de 100644 --- a/lib/rules/zonefile.c +++ b/lib/rules/zonefile.c @@ -50,7 +50,8 @@ static void rr_scan2trie(zs_scanner_t *s) knot_rrset_init(rr, NULL, s->r_type, KNOT_CLASS_IN, s->r_ttl); // we don't ^^ need owner so save allocation } - knot_rrset_add_rdata(rr, s->r_data, s->r_data_length, s_data->pool); + int ret = knot_rrset_add_rdata(rr, s->r_data, s->r_data_length, s_data->pool); + kr_assert(!ret); } /// Process an RRset of other types into a rule static int rr_trie2rule(const char *key_data, uint32_t key_len, trie_val_t *rr_p, void *config) diff --git a/modules/stats/stats.c b/modules/stats/stats.c index d0386738b..4f2fb4051 100644 --- a/modules/stats/stats.c +++ b/modules/stats/stats.c @@ -383,6 +383,8 @@ static int list_entry(const char *key, uint32_t key_len, trie_val_t *val, void * JsonNode *sup = json_find_member(ctx->root, sup_key_nt); if (!sup) { sup = json_mkobject(); + if (kr_fails_assert(sup)) + return 0; json_append_member(ctx->root, sup_key_nt, sup); } if (kr_fails_assert(sup)) @@ -411,6 +413,8 @@ static char* stats_list(void *env, struct kr_module *module, const char *args) JsonNode *sup = json_find_member(root, elm->sup_key); if (!sup) { sup = json_mkobject(); + if (kr_fails_assert(sup)) + break; json_append_member(root, elm->sup_key, sup); } if (kr_fails_assert(sup))