]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Plug some leaks on error paths
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 18 Sep 2021 11:29:57 +0000 (12:29 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 18 Sep 2021 11:29:57 +0000 (12:29 +0100)
Found by: coverity scan

15 files changed:
src/controller.c
src/libserver/cfg_rcl.c
src/libserver/maps/map.c
src/libserver/maps/map_helpers.c
src/libstat/stat_process.c
src/lua/lua_http.c
src/lua/lua_rsa.c
src/lua/lua_text.c
src/lua/lua_url.c
src/rspamadm/lua_repl.c
src/rspamd.c
src/rspamd_proxy.c
src/worker.c
test/rspamd_http_test.c
utils/rspamd_http_server.c

index 0f9a762e159477b22d6e5f30d6131e638ec133cc..a34bb60348bbb39f5ada56ec0f6ff74f8854b3ef 100644 (file)
@@ -3563,7 +3563,7 @@ rspamd_controller_accept_socket (EV_P_ ev_io *w, int revents)
        struct rspamd_worker *worker = (struct rspamd_worker *)w->data;
        struct rspamd_controller_worker_ctx *ctx;
        struct rspamd_controller_session *session;
-       rspamd_inet_addr_t *addr;
+       rspamd_inet_addr_t *addr = NULL;
        gint nfd;
 
        ctx = worker->ctx;
@@ -3576,6 +3576,7 @@ rspamd_controller_accept_socket (EV_P_ ev_io *w, int revents)
        }
        /* Check for EAGAIN */
        if (nfd == 0) {
+               rspamd_inet_address_free (addr);
                return;
        }
 
index 06b7edee214719e3a6f9374d1cd9f9f367ca59bc..47d487ee026bd30f2155938c748ff4c8a9a1fe6b 100644 (file)
@@ -3712,22 +3712,25 @@ rspamd_config_parse_ucl (struct rspamd_config *cfg,
        struct rspamd_cryptobox_keypair *decrypt_keypair = NULL;
        gchar *data;
 
-       if (stat (filename, &st) == -1) {
-               g_set_error (err, cfg_rcl_error_quark (), errno,
-                               "cannot stat %s: %s", filename, strerror (errno));
-               return FALSE;
-       }
        if ((fd = open (filename, O_RDONLY)) == -1) {
                g_set_error (err, cfg_rcl_error_quark (), errno,
                                "cannot open %s: %s", filename, strerror (errno));
                return FALSE;
 
        }
+       if (fstat (fd, &st) == -1) {
+               g_set_error (err, cfg_rcl_error_quark (), errno,
+                               "cannot stat %s: %s", filename, strerror (errno));
+               close (fd);
+
+               return FALSE;
+       }
        /* Now mmap this file to simplify reading process */
        if ((data = mmap (NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0)) == MAP_FAILED) {
                g_set_error (err, cfg_rcl_error_quark (), errno,
                                "cannot mmap %s: %s", filename, strerror (errno));
                close (fd);
+
                return FALSE;
        }
 
@@ -3736,8 +3739,7 @@ rspamd_config_parse_ucl (struct rspamd_config *cfg,
        /* Try to load keyfile if available */
        rspamd_snprintf (keypair_path, sizeof (keypair_path), "%s.key",
                        filename);
-       if (stat (keypair_path, &st) == -1 &&
-               (fd = open (keypair_path, O_RDONLY)) != -1) {
+       if ((fd = open (keypair_path, O_RDONLY)) != -1) {
                struct ucl_parser *kp_parser;
 
                kp_parser = ucl_parser_new (0);
@@ -3769,6 +3771,7 @@ rspamd_config_parse_ucl (struct rspamd_config *cfg,
                }
 
                ucl_parser_free (kp_parser);
+               close (fd);
        }
 
        parser = ucl_parser_new (UCL_PARSER_SAVE_COMMENTS);
@@ -4178,6 +4181,8 @@ rspamd_rcl_add_doc_by_path (struct rspamd_config *cfg,
                                cur = found;
                        }
                }
+
+               g_strfreev (path_components);
        }
 
        return rspamd_rcl_add_doc_obj (ucl_object_ref (cur),
index f324f9d702511406818790aa21a6efe577b472df..eaf7958f8f1f085e9ed085a5e83ad82f2ffb795b 100644 (file)
@@ -596,6 +596,8 @@ read_map_file_chunks (struct rspamd_map *map, struct map_cb_data *cbdata,
        if (lseek (fd, off, SEEK_SET) == -1) {
                msg_err_map ("can't seek in map to pos %d for buffered reading %s: %s",
                                (gint)off, fname, strerror (errno));
+               close (fd);
+
                return FALSE;
        }
 
index f98e4dafc7fe55adbe43366e2bc5e06ff9543714..51bc9710c89fd63672ae8186ecaaa7658aa187c9 100644 (file)
@@ -1868,6 +1868,7 @@ rspamd_cdb_list_read (gchar *chunk,
                cdb = g_malloc0 (sizeof (struct cdb));
 
                if (cdb_init (cdb, fd) == -1) {
+                       g_free (cdb);
                        msg_err_map ("cannot init cdb map from %s: %s", chunk, strerror (errno));
 
                        return NULL;
index 13083986f210a4cf036bf056b9e85a23b68bdf0d..2c77942b600edf73a080091b9976e76dea6c53fc 100644 (file)
@@ -1213,6 +1213,9 @@ rspamd_stat_statistics (struct rspamd_task *task,
        if (target) {
                *target = res;
        }
+       else {
+               ucl_object_unref (res);
+       }
 
        return RSPAMD_STAT_PROCESS_OK;
 }
index d85664ef08c4da008e416a2cf849d23b1e04b3c0..a92c1fe8fc56cafc29504dfeb326963146518c0f 100644 (file)
@@ -978,6 +978,12 @@ lua_http_request (lua_State *L)
        }
 
        if (ev_base == NULL) {
+               g_free (auth);
+               rspamd_http_message_unref (msg);
+               if (body) {
+                       rspamd_fstring_free (body);
+               }
+
                return luaL_error (L,
                                "Bad params to rspamd_http:request(): ev_base isn't passed");
        }
index 4b2caa2bf0f753a92809927857feefed14069144..5e34bc2c692ac48a1a1bb897ea8a68b002d291bc 100644 (file)
@@ -664,6 +664,8 @@ lua_rsa_sign_memory (lua_State *L)
                                signature->str, (guint *)&signature->len, rsa);
 
                if (ret != 1) {
+                       rspamd_fstring_free (signature);
+
                        return luaL_error (L, "cannot sign: %s",
                                        ERR_error_string (ERR_get_error (), NULL));
                }
index dde7e2c235171776c53d1736455a9b2b953e6fdf..bec16c3b63a136334da1678507f20753e7ce3299 100644 (file)
@@ -920,6 +920,10 @@ lua_text_split (lua_State *L)
        struct rspamd_lua_regexp *re;
        gboolean stringify = FALSE, own_re = FALSE;
 
+       if (t == NULL) {
+               return luaL_error (L, "invalid arguments");
+       }
+
        if (lua_type (L, 2) == LUA_TUSERDATA) {
                re = lua_check_regexp (L, 2);
        }
@@ -947,7 +951,7 @@ lua_text_split (lua_State *L)
                own_re = TRUE;
        }
 
-       if (t && re) {
+       if (re) {
                if (lua_isboolean (L, 3)) {
                        stringify = lua_toboolean (L, 3);
                }
index 3298c7bed9d73ea76f136f8a8d1a20c8daa5efd4..26dd1eb7c374cd7fbadba85d2c27cfccba5bf12d 100644 (file)
@@ -1169,6 +1169,8 @@ lua_url_cbdata_fill (lua_State *L,
                        }
                        else {
                                msg_info ("bad url protocol: %s", *cvec);
+                               g_strfreev (strvec);
+
                                return FALSE;
                        }
 
index 3497a85b80a484e06a6588e59572fd6229cb885a..70ce06cd2218b1714e3506a3cfaabfeffcac1ee7 100644 (file)
@@ -721,7 +721,7 @@ rspamadm_lua_accept_cb (EV_P_ ev_io *w, int revents)
 {
        struct rspamadm_lua_repl_context *ctx =
                        (struct rspamadm_lua_repl_context *)w->data;
-       rspamd_inet_addr_t *addr;
+       rspamd_inet_addr_t *addr = NULL;
        struct rspamadm_lua_repl_session *session;
        gint nfd;
 
@@ -732,6 +732,7 @@ rspamadm_lua_accept_cb (EV_P_ ev_io *w, int revents)
        }
        /* Check for EAGAIN */
        if (nfd == 0) {
+               rspamd_inet_address_free (addr);
                return;
        }
 
index 987ac8c5ca42b8e535d227e4a019a808c6da7f50..fd602dd4cf85f23a9a1d57f09032a00815251848 100644 (file)
@@ -1212,7 +1212,7 @@ static void
 rspamd_control_handler (EV_P_ ev_io *w, int revents)
 {
        struct rspamd_main *rspamd_main = (struct rspamd_main *)w->data;
-       rspamd_inet_addr_t *addr;
+       rspamd_inet_addr_t *addr = NULL;
        gint nfd;
 
        if ((nfd =
@@ -1222,6 +1222,7 @@ rspamd_control_handler (EV_P_ ev_io *w, int revents)
        }
        /* Check for EAGAIN */
        if (nfd == 0) {
+               rspamd_inet_address_free (addr);
                return;
        }
 
index 267760c03af2ecbc46e556f9323945aefe73575d..a7944eecfd5b13bae0eb6cc9c963851051fa772e 100644 (file)
@@ -2185,7 +2185,7 @@ proxy_accept_socket (EV_P_ ev_io *w, int revents)
 {
        struct rspamd_worker *worker = (struct rspamd_worker *)w->data;
        struct rspamd_proxy_ctx *ctx;
-       rspamd_inet_addr_t *addr;
+       rspamd_inet_addr_t *addr = NULL;
        struct rspamd_proxy_session *session;
        gint nfd;
 
@@ -2199,6 +2199,7 @@ proxy_accept_socket (EV_P_ ev_io *w, int revents)
        }
        /* Check for EAGAIN */
        if (nfd == 0) {
+               rspamd_inet_address_free (addr);
                return;
        }
 
index 5262f7cde3761373df9fe087b9daec44bd91853a..c2d00d9cd09a09b9fd3652323c62015960f8fe26 100644 (file)
@@ -342,7 +342,7 @@ accept_socket (EV_P_ ev_io *w, int revents)
        struct rspamd_worker *worker = (struct rspamd_worker *) w->data;
        struct rspamd_worker_ctx *ctx;
        struct rspamd_worker_session *session;
-       rspamd_inet_addr_t *addr;
+       rspamd_inet_addr_t *addr = NULL;
        gint nfd, http_opts = 0;
 
        ctx = worker->ctx;
@@ -362,6 +362,8 @@ accept_socket (EV_P_ ev_io *w, int revents)
        }
        /* Check for EAGAIN */
        if (nfd == 0) {
+               rspamd_inet_address_free (addr);
+
                return;
        }
 
index c783ccf214d9f6b18367b1ffbdc06cd715257f38..1b271a7ccc7d82f2ebb2c6a4e481c54d48a72858 100644 (file)
@@ -53,7 +53,7 @@ static void
 rspamd_server_accept (gint fd, short what, void *arg)
 {
        struct rspamd_http_connection_router *rt = arg;
-       rspamd_inet_addr_t *addr;
+       rspamd_inet_addr_t *addr = NULL;
        gint nfd;
 
        if ((nfd =
@@ -63,6 +63,7 @@ rspamd_server_accept (gint fd, short what, void *arg)
        }
        /* Check for EAGAIN */
        if (nfd == 0) {
+               rspamd_inet_address_free (addr);
                return;
        }
 
index f4b8e3b5f7bd5196471e6e8dd739087a5a2a2020..679ffa0b6e91037a9656dc673c8e8c723cc47434 100644 (file)
@@ -145,6 +145,7 @@ rspamd_server_accept (gint fd, short what, void *arg)
                }
                /* Check for EAGAIN */
                if (nfd == 0) {
+                       rspamd_inet_address_free (addr);
                        return;
                }