Browse Source

Fix another critical issue with memory corruption and ownership

tags/1.1.0
Vsevolod Stakhov 8 years ago
parent
commit
d315a3368c
2 changed files with 9 additions and 17 deletions
  1. 9
    16
      src/libmime/mime_expressions.c
  2. 0
    1
      src/lua/lua_regexp.c

+ 9
- 16
src/libmime/mime_expressions.c View File

@@ -189,12 +189,12 @@ rspamd_mime_expr_quark (void)
* Rspamd regexp utility functions
*/
static struct rspamd_regexp_atom *
rspamd_mime_expr_parse_regexp_atom (rspamd_mempool_t * pool, const gchar *line)
rspamd_mime_expr_parse_regexp_atom (rspamd_mempool_t * pool, const gchar *line,
struct rspamd_config *cfg)
{
const gchar *begin, *end, *p, *src, *start;
gchar *dbegin, *dend;
struct rspamd_regexp_atom *result;
rspamd_regexp_t *re;
GError *err = NULL;
GString *re_flags;

@@ -203,10 +203,6 @@ rspamd_mime_expr_parse_regexp_atom (rspamd_mempool_t * pool, const gchar *line)
return NULL;
}

if ((re = rspamd_regexp_cache_query (NULL, line, NULL)) != NULL) {
return ((struct rspamd_regexp_atom *)rspamd_regexp_get_ud (re));
}

src = line;
result = rspamd_mempool_alloc0 (pool, sizeof (struct rspamd_regexp_atom));
/* Skip whitespaces */
@@ -356,19 +352,15 @@ rspamd_mime_expr_parse_regexp_atom (rspamd_mempool_t * pool, const gchar *line)
return NULL;
}

if (result->regexp) {
if (result->is_multiple) {
rspamd_regexp_set_maxhits (result->regexp, 0);
}
else {
rspamd_regexp_set_maxhits (result->regexp, 1);
}
if (result->is_multiple) {
rspamd_regexp_set_maxhits (result->regexp, 0);
}
else {
rspamd_regexp_set_maxhits (result->regexp, 1);
}

rspamd_regexp_set_ud (result->regexp, result);

rspamd_regexp_cache_insert (NULL, line, NULL, result->regexp);

*dend = '/';

return result;
@@ -621,7 +613,7 @@ set:

if (type == MIME_ATOM_REGEXP) {
mime_atom->d.re = rspamd_mime_expr_parse_regexp_atom (pool,
mime_atom->str);
mime_atom->str, cfg);
if (mime_atom->d.re == NULL) {
g_set_error (err, rspamd_mime_expr_quark(), 200, "cannot parse regexp '%s'",
mime_atom->str);
@@ -631,6 +623,7 @@ set:
/* Register new item in the cache */
if (mime_atom->d.re->type == RSPAMD_RE_HEADER ||
mime_atom->d.re->type == RSPAMD_RE_RAWHEADER) {

if (mime_atom->d.re->header != NULL) {
own_re = mime_atom->d.re->regexp;
mime_atom->d.re->regexp = rspamd_re_cache_add (cfg->re_cache,

+ 0
- 1
src/lua/lua_regexp.c View File

@@ -711,7 +711,6 @@ lua_regexp_gc (lua_State *L)
struct rspamd_lua_regexp *to_del = lua_check_regexp (L);

if (to_del) {
msg_warn ("del: %p", to_del->re);
if (!IS_DESTROYED (to_del)) {
rspamd_regexp_unref (to_del->re);
}

Loading…
Cancel
Save