]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Fix] More lua_settop fixes in MIME processing
authorVsevolod Stakhov <vsevolod@rspamd.com>
Tue, 23 Dec 2025 11:15:21 +0000 (11:15 +0000)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Tue, 23 Dec 2025 11:15:21 +0000 (11:15 +0000)
Fix additional lua_settop(L, 0) calls in rspamd_message_from_data
and rspamd_mime_expr_process that could corrupt the Lua stack.

src/libmime/message.c
src/libmime/mime_expressions.c

index 2bc8fbdedb112b44c788b45612c3945e5baa73ca..0a7a445a18d325ad95de6f4e6ef4db550cc87ed9 100644 (file)
@@ -1173,6 +1173,7 @@ rspamd_message_from_data(struct rspamd_task *task, const unsigned char *start,
        }
        else if (task->cfg && task->cfg->libs_ctx) {
                lua_State *L = task->cfg->lua_state;
+               int old_top = lua_gettop(L);
 
                if (task->cfg->mime_parser_cfg &&
                        rspamd_mime_parser_get_lua_magic_cbref(task->cfg->mime_parser_cfg) != -1) {
@@ -1202,7 +1203,7 @@ rspamd_message_from_data(struct rspamd_task *task, const unsigned char *start,
                                }
                        }
 
-                       lua_settop(L, 0);
+                       lua_settop(L, old_top);
                }
                else if (rspamd_lua_require_function(L,
                                                                                         "lua_magic", "detect_mime_part")) {
@@ -1232,7 +1233,7 @@ rspamd_message_from_data(struct rspamd_task *task, const unsigned char *start,
                                }
                        }
 
-                       lua_settop(L, 0);
+                       lua_settop(L, old_top);
                }
                else {
                        msg_err_task("cannot require lua_magic.detect_mime_part");
index f77017ff213a47da16d252e2c7af6e7511039b62..3302a0982d7f5b965966f3f1a8732079f43b5ab2 100644 (file)
@@ -1181,9 +1181,10 @@ rspamd_mime_expr_process(void *ud, rspamd_expression_atom_t *atom)
                }
        }
        else if (mime_atom->type == MIME_ATOM_LOCAL_LUA_FUNCTION) {
-               int err_idx;
+               int err_idx, old_top;
 
                L = task->cfg->lua_state;
+               old_top = lua_gettop(L);
                lua_pushcfunction(L, &rspamd_lua_traceback);
                err_idx = lua_gettop(L);
 
@@ -1208,7 +1209,7 @@ rspamd_mime_expr_process(void *ud, rspamd_expression_atom_t *atom)
                        }
                }
 
-               lua_settop(L, 0);
+               lua_settop(L, old_top);
        }
        else {
                ret = rspamd_mime_expr_process_function(mime_atom->d.func, task,