]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Rework to fix issues in Lua API
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 25 Sep 2021 12:01:23 +0000 (13:01 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 25 Sep 2021 12:01:23 +0000 (13:01 +0100)
Found by: coverity scan

src/lua/lua_common.h
src/lua/lua_cryptobox.c
src/lua/lua_mimepart.c
src/lua/lua_spf.c
src/lua/lua_task.c

index 10816d450d196e5c9dc8e2e6b2e86fd2ea3dceb4..a1f62cdb6df34d57982dc3e4439c58f98689ef00 100644 (file)
@@ -527,6 +527,14 @@ gsize lua_logger_out_type (lua_State *L, gint pos, gchar *outbuf,
 */
 void *rspamd_lua_check_udata (lua_State *L, gint pos, const gchar *classname);
 
+#define RSPAMD_LUA_CHECK_UDATA_PTR_OR_RETURN(L, pos, classname, type, dest)  do { \
+    type **_maybe_ptr = (type **)rspamd_lua_check_udata((L), (pos), (classname)); \
+    if (_maybe_ptr == NULL) { \
+        return luaL_error (L, "%s: invalid arguments; pos = %d; expected = %s", G_STRFUNC, (pos), (classname)); \
+    } \
+    (dest) = *(_maybe_ptr);                                                          \
+} while(0)
+
 /**
 * Safely checks userdata to match specified class
 * @param L
index 9cea183117bd9f117cf4109648fccd93521cf21a..f16fd8b674252a1169d45721019c0d461beb73c0 100644 (file)
@@ -2019,6 +2019,10 @@ lua_cryptobox_encrypt_memory (lua_State *L)
                        gint ret = luaL_error (L, "cannot encrypt data: %s", err->message);
                        g_error_free (err);
 
+                       if (owned_pk) {
+                               rspamd_pubkey_unref (pk);
+                       }
+
                        return ret;
                }
        }
@@ -2027,6 +2031,10 @@ lua_cryptobox_encrypt_memory (lua_State *L)
                        gint ret = luaL_error (L, "cannot encrypt data: %s", err->message);
                        g_error_free (err);
 
+                       if (owned_pk) {
+                               rspamd_pubkey_unref (pk);
+                       }
+
                        return ret;
                }
        }
@@ -2065,7 +2073,7 @@ lua_cryptobox_encrypt_file (lua_State *L)
        struct rspamd_cryptobox_keypair *kp = NULL;
        struct rspamd_cryptobox_pubkey *pk = NULL;
        const gchar *filename;
-       gchar *data;
+       gchar *data = NULL;
        guchar *out = NULL;
        struct rspamd_lua_text *res;
        gsize len = 0, outlen = 0;
@@ -2104,6 +2112,9 @@ lua_cryptobox_encrypt_file (lua_State *L)
                                        err->message);
                        g_error_free (err);
                        munmap (data, len);
+                       if (own_pk) {
+                               rspamd_pubkey_unref (pk);
+                       }
 
                        return ret;
                }
@@ -2115,6 +2126,10 @@ lua_cryptobox_encrypt_file (lua_State *L)
                        g_error_free (err);
                        munmap (data, len);
 
+                       if (own_pk) {
+                               rspamd_pubkey_unref (pk);
+                       }
+
                        return ret;
                }
        }
@@ -2132,6 +2147,9 @@ lua_cryptobox_encrypt_file (lua_State *L)
        return 1;
 
 err:
+       if (data) {
+               munmap (data, len);
+       }
        if (own_pk) {
                rspamd_pubkey_unref (pk);
        }
index 21a46d496e848fc6b4284749a8bcfa35c68c6e95..2018819e8509ff983b789cf7ec96d8e7f78e5498 100644 (file)
@@ -2031,8 +2031,8 @@ lua_mimepart_headers_foreach (lua_State *L)
                        lua_gettable (L, 3);
 
                        if (lua_isuserdata (L, -1)) {
-                               re = *(struct rspamd_lua_regexp **)
-                                               rspamd_lua_check_udata (L, -1, "rspamd{regexp}");
+                               RSPAMD_LUA_CHECK_UDATA_PTR_OR_RETURN(L, -1, "rspamd{regexp}",
+                                               struct rspamd_lua_regexp, re);
                        }
 
                        lua_pop (L, 1);
index 22f1ad2b2739bfacb3928d2cae6a3624e1dc91be..a55b511be954ed3f06d4c638df54f754973aadb7 100644 (file)
@@ -258,9 +258,11 @@ lua_spf_resolve (lua_State * L)
 static gint
 lua_spf_record_dtor (lua_State *L)
 {
-       struct spf_resolved *record =
-                       * (struct spf_resolved **)rspamd_lua_check_udata (L, 1,
-                                       SPF_RECORD_CLASS);
+       struct spf_resolved *record;
+
+       RSPAMD_LUA_CHECK_UDATA_PTR_OR_RETURN(L, 1, SPF_RECORD_CLASS,
+                       struct spf_resolved,
+                       record);
 
        if (record) {
                spf_record_unref (record);
@@ -398,9 +400,10 @@ spf_check_element (lua_State *L, struct spf_resolved *rec, struct spf_addr *addr
 static gint
 lua_spf_record_check_ip (lua_State *L)
 {
-       struct spf_resolved *record =
-                       * (struct spf_resolved **)rspamd_lua_check_udata (L, 1,
-                                       SPF_RECORD_CLASS);
+       struct spf_resolved *record;
+       RSPAMD_LUA_CHECK_UDATA_PTR_OR_RETURN(L, 1, SPF_RECORD_CLASS,
+                       struct spf_resolved,
+                       record);
        struct rspamd_lua_ip *ip = NULL;
        gint nres = 0;
        gboolean need_free_ip = FALSE;
@@ -474,9 +477,10 @@ lua_spf_record_check_ip (lua_State *L)
 static gint
 lua_spf_record_get_domain (lua_State *L)
 {
-       struct spf_resolved *record =
-                       *(struct spf_resolved **) rspamd_lua_check_udata (L, 1,
-                                       SPF_RECORD_CLASS);
+       struct spf_resolved *record;
+       RSPAMD_LUA_CHECK_UDATA_PTR_OR_RETURN(L, 1, SPF_RECORD_CLASS,
+                       struct spf_resolved,
+                       record);
 
        if (record) {
                lua_pushstring (L, record->domain);
@@ -495,9 +499,10 @@ lua_spf_record_get_domain (lua_State *L)
 static gint
 lua_spf_record_get_ttl (lua_State *L)
 {
-       struct spf_resolved *record =
-                       *(struct spf_resolved **) rspamd_lua_check_udata (L, 1,
-                                       SPF_RECORD_CLASS);
+       struct spf_resolved *record;
+       RSPAMD_LUA_CHECK_UDATA_PTR_OR_RETURN(L, 1, SPF_RECORD_CLASS,
+                       struct spf_resolved,
+                       record);
 
        if (record) {
                lua_pushinteger (L, record->ttl);
@@ -516,9 +521,10 @@ lua_spf_record_get_ttl (lua_State *L)
 static gint
 lua_spf_record_get_timestamp (lua_State *L)
 {
-       struct spf_resolved *record =
-                       *(struct spf_resolved **) rspamd_lua_check_udata (L, 1,
-                                       SPF_RECORD_CLASS);
+       struct spf_resolved *record;
+       RSPAMD_LUA_CHECK_UDATA_PTR_OR_RETURN(L, 1, SPF_RECORD_CLASS,
+                       struct spf_resolved,
+                       record);
 
        if (record) {
                lua_pushnumber (L, record->timestamp);
@@ -537,9 +543,10 @@ lua_spf_record_get_timestamp (lua_State *L)
 static gint
 lua_spf_record_get_digest (lua_State *L)
 {
-       struct spf_resolved *record =
-                       *(struct spf_resolved **) rspamd_lua_check_udata (L, 1,
-                                       SPF_RECORD_CLASS);
+       struct spf_resolved *record;
+       RSPAMD_LUA_CHECK_UDATA_PTR_OR_RETURN(L, 1, SPF_RECORD_CLASS,
+                       struct spf_resolved,
+                       record);
 
        if (record) {
                gchar hexbuf[64];
@@ -567,9 +574,10 @@ lua_spf_record_get_digest (lua_State *L)
 static gint
 lua_spf_record_get_elts (lua_State *L)
 {
-       struct spf_resolved *record =
-                       *(struct spf_resolved **) rspamd_lua_check_udata (L, 1,
-                                       SPF_RECORD_CLASS);
+       struct spf_resolved *record;
+       RSPAMD_LUA_CHECK_UDATA_PTR_OR_RETURN(L, 1, SPF_RECORD_CLASS,
+                       struct spf_resolved,
+                       record);
 
        if (record) {
                guint i;
index 589d45439a2717ebe1be5b9c139954a98ae6126b..de2b130d6e40d6b768ee572b4096870513f5297e 100644 (file)
@@ -6679,8 +6679,8 @@ lua_task_headers_foreach (lua_State *L)
                                lua_gettable (L, 3);
 
                                if (lua_isuserdata (L, -1)) {
-                                       re = *(struct rspamd_lua_regexp **)
-                                                       rspamd_lua_check_udata (L, -1, "rspamd{regexp}");
+                                       RSPAMD_LUA_CHECK_UDATA_PTR_OR_RETURN(L, -1, "rspamd{regexp}",
+                                                       struct rspamd_lua_regexp, re);
                                }
 
                                lua_pop (L, 1);