]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
daemon, lib, modules: trivial fixes for Coverity issues docs-develop-cove-uiak3c/deployments/4083
authorOto Šťáva <oto.stava@nic.cz>
Wed, 15 May 2024 12:46:00 +0000 (14:46 +0200)
committerOto Šťáva <oto.stava@nic.cz>
Wed, 15 May 2024 12:46:00 +0000 (14:46 +0200)
daemon/bindings/event.c
daemon/io.c
daemon/session2.c
daemon/tls_ephemeral_credentials.c
lib/rules/api.c
lib/rules/zonefile.c
modules/stats/stats.c

index 686e33e9d6126b8646416c028fadb9f423e15b73..7e14dcd666c5e22842305ccd023008a5228a9b22 100644 (file)
@@ -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)
index a32f5a3fe907fe76178f87c3f5ee7eb7afe0a1e4..5ed2ef78a064f026a37aab80b544b076ab8aee20 100644 (file)
@@ -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);
 }
index c3d5765a9229e9e20375baa340dfb5a1fe9852fa..566ff0c0ac1a0cfadd5dfe4e85532a62cebe43db 100644 (file)
@@ -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 {
index 768942bb3359c974e5b1420704b4349220d95d70..712e355b17530291b4ddccb263e1f45d78f8221c 100644 (file)
@@ -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;
                }
index ca0268797c9b6fb8fadff225cca23e2b627d9e24..c10cbb0b116f16e51e2175efc4922cae9509ad31 100644 (file)
@@ -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`.
index cfd2bc276676639f8743a15a32a2633d7c4857ff..74a7317defa9e7e7b43586e702294a0f122fc170 100644 (file)
@@ -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)
index d0386738b1fd0102f1d04b50b1623f02b1a6793a..4f2fb405114117184cee5112e30a630fd48bb797 100644 (file)
@@ -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))