aboutsummaryrefslogtreecommitdiffstats
path: root/src/libutil/regexp.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2018-05-05 12:41:20 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2018-05-05 12:41:40 +0100
commit00911f6a9e3b436c18d8445bc27c7699a73e9b79 (patch)
tree24ea0d671b6fa4969ed405c15e5b1a575d0e159f /src/libutil/regexp.c
parent22bac56f258e2afcda6d2104fc5e2aaedf8c123b (diff)
downloadrspamd-00911f6a9e3b436c18d8445bc27c7699a73e9b79.tar.gz
rspamd-00911f6a9e3b436c18d8445bc27c7699a73e9b79.zip
[Feature] Use common jit cache for all regexps
Diffstat (limited to 'src/libutil/regexp.c')
-rw-r--r--src/libutil/regexp.c79
1 files changed, 36 insertions, 43 deletions
diff --git a/src/libutil/regexp.c b/src/libutil/regexp.c
index 33bb5711e..627ec6a5a 100644
--- a/src/libutil/regexp.c
+++ b/src/libutil/regexp.c
@@ -60,10 +60,6 @@ struct rspamd_regexp_s {
pcre2_match_context *mcontext;
pcre2_match_context *raw_mcontext;
#endif
-#ifdef HAVE_PCRE_JIT
- PCRE_JIT_T *jstack;
- PCRE_JIT_T *raw_jstack;
-#endif
regexp_id_t id;
ref_entry_t ref;
gpointer ud;
@@ -78,6 +74,9 @@ struct rspamd_regexp_s {
struct rspamd_regexp_cache {
GHashTable *tbl;
+#ifdef HAVE_PCRE_JIT
+ PCRE_JIT_T *jstack;
+#endif
};
static struct rspamd_regexp_cache *global_re_cache = NULL;
@@ -126,11 +125,6 @@ rspamd_regexp_dtor (rspamd_regexp_t *re)
pcre2_match_context_free (re->mcontext);
}
#endif
-#ifdef HAVE_PCRE_JIT
- if (re->raw_jstack) {
- PCRE_JIT_STACK_FREE (re->raw_jstack);
- }
-#endif
PCRE_FREE (re->raw_re);
}
if (re->re) {
@@ -145,11 +139,6 @@ rspamd_regexp_dtor (rspamd_regexp_t *re)
pcre2_match_context_free (re->raw_mcontext);
}
#endif
-#ifdef HAVE_PCRE_JIT
- if (re->jstack) {
- PCRE_JIT_STACK_FREE (re->jstack);
- }
-#endif
PCRE_FREE (re->re);
}
@@ -164,6 +153,9 @@ rspamd_regexp_dtor (rspamd_regexp_t *re)
static void
rspamd_regexp_post_process (rspamd_regexp_t *r)
{
+ if (global_re_cache == NULL) {
+ rspamd_regexp_library_init ();
+ }
#if defined(WITH_PCRE2)
gsize jsz;
guint jit_flags = PCRE2_JIT_COMPLETE;
@@ -184,17 +176,14 @@ rspamd_regexp_post_process (rspamd_regexp_t *r)
r->flags |= RSPAMD_REGEXP_FLAG_DISABLE_JIT;
}
else {
- if (pcre2_pattern_info (r->re, PCRE2_INFO_JITSIZE, &jsz) >= 0 && jsz > 0) {
- r->jstack = pcre2_jit_stack_create (32 * 1024, 512 * 1024, NULL);
- }
- else {
+ if (!(pcre2_pattern_info (r->re, PCRE2_INFO_JITSIZE, &jsz) >= 0 && jsz > 0)) {
msg_err ("jit compilation of %s is not supported", r->pattern);
r->flags |= RSPAMD_REGEXP_FLAG_DISABLE_JIT;
}
}
- if (r->jstack && !(r->flags & RSPAMD_REGEXP_FLAG_DISABLE_JIT)) {
- pcre2_jit_stack_assign (r->mcontext, NULL, r->jstack);
+ if (!(r->flags & RSPAMD_REGEXP_FLAG_DISABLE_JIT)) {
+ pcre2_jit_stack_assign (r->mcontext, NULL, global_re_cache->jstack);
}
if (r->re != r->raw_re) {
@@ -203,20 +192,13 @@ rspamd_regexp_post_process (rspamd_regexp_t *r)
r->flags |= RSPAMD_REGEXP_FLAG_DISABLE_JIT;
}
- if (pcre2_pattern_info (r->raw_re, PCRE2_INFO_JITSIZE, &jsz) >= 0 && jsz > 0) {
- r->raw_jstack = pcre2_jit_stack_create (32 * 1024, 512 * 1024, NULL);
- }
- else {
+ if (!(pcre2_pattern_info (r->raw_re, PCRE2_INFO_JITSIZE, &jsz) >= 0 && jsz > 0)) {
msg_debug ("jit compilation of raw %s is not supported", r->pattern);
}
-
- if (r->raw_jstack && !(r->flags & RSPAMD_REGEXP_FLAG_DISABLE_JIT)) {
- pcre2_jit_stack_assign (r->raw_mcontext, NULL, r->raw_jstack);
+ else if (!(r->flags & RSPAMD_REGEXP_FLAG_DISABLE_JIT)) {
+ pcre2_jit_stack_assign (r->raw_mcontext, NULL, global_re_cache->jstack);
}
}
- else {
- r->raw_jstack = r->jstack;
- }
#endif
#else
@@ -268,12 +250,10 @@ rspamd_regexp_post_process (rspamd_regexp_t *r)
if (n != 0 || jit != 1) {
msg_debug ("jit compilation of %s is not supported", r->pattern);
- r->jstack = NULL;
r->flags |= RSPAMD_REGEXP_FLAG_DISABLE_JIT;
}
else {
- r->jstack = pcre_jit_stack_alloc (32 * 1024, 512 * 1024);
- pcre_assign_jit_stack (r->extra, NULL, r->jstack);
+ pcre_assign_jit_stack (r->extra, NULL, global_re_cache->jstack);
}
}
#endif
@@ -290,22 +270,18 @@ rspamd_regexp_post_process (rspamd_regexp_t *r)
if (can_jit) {
- if (r->raw_re == r->re) {
- r->raw_jstack = r->jstack;
- }
- else {
+ if (r->raw_re != r->re) {
jit = 0;
n = pcre_fullinfo (r->raw_re, r->raw_extra,
PCRE_INFO_JIT, &jit);
if (n != 0 || jit != 1) {
msg_debug ("jit compilation of %s is not supported", r->pattern);
- r->raw_jstack = NULL;
r->flags |= RSPAMD_REGEXP_FLAG_DISABLE_JIT;
}
else {
- r->raw_jstack = pcre_jit_stack_alloc (32 * 1024, 512 * 1024);
- pcre_assign_jit_stack (r->raw_extra, NULL, r->raw_jstack);
+ pcre_assign_jit_stack (r->raw_extra, NULL,
+ global_re_cache->jstack);
}
}
}
@@ -575,7 +551,7 @@ rspamd_regexp_search (rspamd_regexp_t *re, const gchar *text, gsize len,
r = re->raw_re;
ext = re->raw_extra;
#if defined(HAVE_PCRE_JIT) && defined(HAVE_PCRE_JIT_FAST) && !defined(DISABLE_JIT_FAST)
- st = re->raw_jstack;
+ st = global_re_cache->jstack;
#endif
}
else {
@@ -583,7 +559,7 @@ rspamd_regexp_search (rspamd_regexp_t *re, const gchar *text, gsize len,
ext = re->extra;
#if defined(HAVE_PCRE_JIT) && defined(HAVE_PCRE_JIT_FAST) && !defined(DISABLE_JIT_FAST)
if (g_utf8_validate (mt, remain, NULL)) {
- st = re->jstack;
+ st = global_re_cache->jstack;
}
else {
msg_err ("bad utf8 input for JIT re");
@@ -950,7 +926,13 @@ rspamd_regexp_cache_new (void)
ncache = g_malloc0 (sizeof (*ncache));
ncache->tbl = g_hash_table_new_full (rspamd_regexp_hash, rspamd_regexp_equal,
NULL, (GDestroyNotify)rspamd_regexp_unref);
-
+#ifdef HAVE_PCRE_JIT
+#ifdef WITH_PCRE2
+ ncache->jstack = pcre2_jit_stack_create (32 * 1024, 1024 * 1024, NULL);
+#else
+ ncache->jstack = pcre_jit_stack_alloc (32 * 1024, 1024 * 1024);
+#endif
+#endif
return ncache;
}
@@ -1045,6 +1027,17 @@ rspamd_regexp_cache_destroy (struct rspamd_regexp_cache *cache)
{
if (cache != NULL) {
g_hash_table_destroy (cache->tbl);
+#ifdef HAVE_PCRE_JIT
+#ifdef WITH_PCRE2
+ if (cache->jstack) {
+ pcre2_jit_stack_free (cache->jstack);
+ }
+#else
+ if (cache->jstack) {
+ pcre_jit_stack_free (cache->jstack);
+ }
+#endif
+#endif
}
}