aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2015-03-06 00:25:39 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2015-03-06 00:25:39 +0000
commitb66a09265f3e2c139b5b021a91aad4242d04de57 (patch)
tree108acd5414eb16adab3fe48b7ef115a77b921c8f /src
parent50cb1d594e2cd6430d5a632ac424b6c9383c77c9 (diff)
downloadrspamd-b66a09265f3e2c139b5b021a91aad4242d04de57.tar.gz
rspamd-b66a09265f3e2c139b5b021a91aad4242d04de57.zip
More fixes to regexp module.
Diffstat (limited to 'src')
-rw-r--r--src/libutil/regexp.c24
-rw-r--r--src/lua/lua_regexp.c15
2 files changed, 29 insertions, 10 deletions
diff --git a/src/libutil/regexp.c b/src/libutil/regexp.c
index 9a57ed380..3f93051f6 100644
--- a/src/libutil/regexp.c
+++ b/src/libutil/regexp.c
@@ -283,11 +283,11 @@ rspamd_regexp_search (rspamd_regexp_t *re, const gchar *text, gsize len,
{
pcre *r;
pcre_extra *ext;
-#ifdef HAVE_PCRE_JIT
+#if defined(HAVE_PCRE_JIT) && (PCRE_MAJOR == 8 && PCRE_MINOR >= 32)
pcre_jit_stack *st;
#endif
const gchar *mt;
- gsize remain;
+ gsize remain = 0;
gint rc, match_flags = 0, ovec[10];
g_assert (re != NULL);
@@ -295,19 +295,26 @@ rspamd_regexp_search (rspamd_regexp_t *re, const gchar *text, gsize len,
if (end != NULL && *end != NULL) {
/* Incremental search */
- mt = (*end) + 1;
- remain = len - (mt - text);
+ mt = (*end);
+
+ if ((gint)len > (mt - text)) {
+ remain = len - (mt - text);
+ }
}
else {
mt = text;
remain = len;
}
+ if (remain == 0) {
+ return FALSE;
+ }
+
match_flags = PCRE_NEWLINE_ANYCRLF;
if ((re->flags & RSPAMD_REGEXP_FLAG_RAW) || raw) {
r = re->raw_re;
ext = re->raw_extra;
-#ifdef HAVE_PCRE_JIT
+#if defined(HAVE_PCRE_JIT) && (PCRE_MAJOR == 8 && PCRE_MINOR >= 32)
st = re->raw_jstack;
#endif
}
@@ -315,7 +322,7 @@ rspamd_regexp_search (rspamd_regexp_t *re, const gchar *text, gsize len,
match_flags |= PCRE_NO_UTF8_CHECK;
r = re->re;
ext = re->extra;
-#ifdef HAVE_PCRE_JIT
+#if defined(HAVE_PCRE_JIT) && (PCRE_MAJOR == 8 && PCRE_MINOR >= 32)
st = re->jstack;
#endif
}
@@ -330,8 +337,13 @@ rspamd_regexp_search (rspamd_regexp_t *re, const gchar *text, gsize len,
if (!(re->flags & RSPAMD_REGEXP_FLAG_NOOPT)) {
#ifdef HAVE_PCRE_JIT
+# if (PCRE_MAJOR == 8 && PCRE_MINOR >= 32)
rc = pcre_jit_exec (r, ext, mt, remain, 0, match_flags, ovec,
G_N_ELEMENTS (ovec), st);
+# else
+ rc = pcre_exec (r, ext, mt, remain, 0, match_flags, ovec,
+ G_N_ELEMENTS (ovec));
+#endif
#else
rc = pcre_exec (r, ext, mt, remain, 0, match_flags, ovec,
G_N_ELEMENTS (ovec));
diff --git a/src/lua/lua_regexp.c b/src/lua/lua_regexp.c
index 64312be70..d363ee4a6 100644
--- a/src/lua/lua_regexp.c
+++ b/src/lua/lua_regexp.c
@@ -141,10 +141,13 @@ lua_regexp_get_cached (lua_State *L)
{
struct rspamd_lua_regexp *new, **pnew;
const gchar *line;
+ rspamd_regexp_t *re;
line = luaL_checkstring (L, 1);
- new = rspamd_regexp_cache_query (NULL, line, NULL);
- if (new) {
+ re = rspamd_regexp_cache_query (NULL, line, NULL);
+ if (re) {
+ new = g_slice_alloc (sizeof (struct rspamd_lua_regexp));
+ new->re = re;
pnew = lua_newuserdata (L, sizeof (struct rspamd_lua_regexp *));
rspamd_lua_setclass (L, "rspamd{regexp}", -1);
*pnew = new;
@@ -176,11 +179,15 @@ lua_regexp_create_cached (lua_State *L)
{
const gchar *line;
struct rspamd_lua_regexp *new, **pnew;
+ rspamd_regexp_t *re;
line = luaL_checkstring (L, 1);
- new = rspamd_regexp_cache_query (NULL, line, NULL);
- if (new) {
+ re = rspamd_regexp_cache_query (NULL, line, NULL);
+ if (re) {
+ new = g_slice_alloc (sizeof (struct rspamd_lua_regexp));
+ new->re = re;
pnew = lua_newuserdata (L, sizeof (struct rspamd_lua_regexp *));
+
rspamd_lua_setclass (L, "rspamd{regexp}", -1);
*pnew = new;
}