]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Fix memory leak in `lua_new_text` invocations
authorVsevolod Stakhov <vsevolod@rspamd.com>
Fri, 1 Nov 2024 09:38:11 +0000 (09:38 +0000)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Fri, 1 Nov 2024 09:38:11 +0000 (09:38 +0000)
src/lua/lua_common.h
src/lua/lua_compress.c
src/lua/lua_text.c
src/lua/lua_util.c

index 198735c66893349090daf1140b1917743cb280d3..1d39d0c52b5bfd9c01c856c1f46445a355420733 100644 (file)
@@ -94,8 +94,7 @@ static inline int lua_absindex(lua_State *L, int i)
 #define LUA_PUBLIC_FUNCTION_DEF(class, name) int lua_##class##_##name(lua_State *L)
 #define LUA_INTERFACE_DEF(class, name) \
        {                                  \
-               #name, lua_##class##_##name    \
-       }
+               #name, lua_##class##_##name}
 
 extern const luaL_reg null_reg[];
 
@@ -281,7 +280,7 @@ struct rspamd_lua_text *lua_check_text_or_string(lua_State *L, int pos);
  * @return
  */
 struct rspamd_lua_text *lua_new_text(lua_State *L, const char *start,
-                                                                        gsize len, gboolean own);
+                                                                        gsize len, gboolean allocate_memory);
 /**
  * Create new text object from task pool if allocation is needed
  * @param task
index 4a348404c2fb28364b1b54e1a9e250a093575696..c82394ed62db4afb2b0c4a9ecc47f68b9f916007 100644 (file)
@@ -1,11 +1,11 @@
-/*-
- * Copyright 2021 Vsevolod Stakhov
+/*
+ * Copyright 2024 Vsevolod Stakhov
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *    http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -504,7 +504,8 @@ lua_zstd_compress_stream(lua_State *L)
                return lua_zstd_push_error(L, err);
        }
 
-       lua_new_text(L, onb.dst, onb.pos, TRUE);
+       t = lua_new_text(L, onb.dst, onb.pos, FALSE);
+       t->flags |= RSPAMD_TEXT_FLAG_OWN;
 
        return 1;
 }
@@ -598,7 +599,8 @@ lua_zstd_decompress_stream(lua_State *L)
                return lua_zstd_push_error(L, err);
        }
 
-       lua_new_text(L, onb.dst, onb.pos, TRUE);
+       t = lua_new_text(L, onb.dst, onb.pos, FALSE);
+       t->flags |= RSPAMD_TEXT_FLAG_OWN;
 
        return 1;
 }
index 4478314f15c4cca4c352098563edea96ac012868..3342fc95cc504d924b1c221ecce1624ac55ff67a 100644 (file)
@@ -312,14 +312,14 @@ lua_check_text_or_string(lua_State *L, int pos)
 }
 
 struct rspamd_lua_text *
-lua_new_text(lua_State *L, const char *start, gsize len, gboolean own)
+lua_new_text(lua_State *L, const char *start, gsize len, gboolean allocate_memory)
 {
        struct rspamd_lua_text *t;
 
        t = lua_newuserdata(L, sizeof(*t));
        t->flags = 0;
 
-       if (own) {
+       if (allocate_memory) {
                char *storage;
 
                if (len > 0) {
index 92f831f6f72a6a36122a8e51ff09548e09a6715f..251d1e1e7ea0e72c1847e73775c04fe12dd55598 100644 (file)
@@ -1025,7 +1025,12 @@ lua_util_encode_base64(lua_State *L)
                }
 
                if (out != NULL) {
-                       lua_new_text(L, out, outlen, TRUE);
+                       /*
+                        * Manually set OWN flag, as `lua_new_text` will allocate another chunk of memory,
+                        * and we will have memory leak of the memory allocated by `rspamd_encode_base64_fold`
+                        */
+                       t = lua_new_text(L, out, outlen, FALSE);
+                       t->flags = RSPAMD_TEXT_FLAG_OWN;
                }
                else {
                        lua_pushnil(L);
@@ -1650,7 +1655,9 @@ lua_util_transliterate(lua_State *L)
 
        gsize outlen;
        char *transliterated = rspamd_utf8_transliterate(t->start, t->len, &outlen);
-       lua_new_text(L, transliterated, outlen, TRUE);
+
+       t = lua_new_text(L, transliterated, outlen, FALSE);
+       t->flags = RSPAMD_TEXT_FLAG_OWN;
 
        return 1;
 }