diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2017-04-21 11:41:49 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2017-04-21 11:41:49 +0100 |
commit | 6e8a06293ca2e44082d55cad1e63b1164515839a (patch) | |
tree | ae3b5b3c6791b4650c2cfa09917ccacaecaa8525 /src/libutil | |
parent | 79476cf36afe99b196502a109c85434b59ad5fd7 (diff) | |
download | rspamd-6e8a06293ca2e44082d55cad1e63b1164515839a.tar.gz rspamd-6e8a06293ca2e44082d55cad1e63b1164515839a.zip |
[Minor] Use hyperscan check function
Diffstat (limited to 'src/libutil')
-rw-r--r-- | src/libutil/multipattern.c | 57 | ||||
-rw-r--r-- | src/libutil/multipattern.h | 13 |
2 files changed, 50 insertions, 20 deletions
diff --git a/src/libutil/multipattern.c b/src/libutil/multipattern.c index 13a167cd1..35ef51a70 100644 --- a/src/libutil/multipattern.c +++ b/src/libutil/multipattern.c @@ -28,10 +28,15 @@ #define MAX_SCRATCH 4 +enum rspamd_hs_check_state { + RSPAMD_HS_UNCHECKED = 0, + RSPAMD_HS_SUPPORTED, + RSPAMD_HS_UNSUPPORTED +}; + static const char *hs_cache_dir = NULL; -#ifdef WITH_HYPERSCAN -static gboolean hs_suitable_cpu = FALSE; -#endif +static enum rspamd_hs_check_state hs_suitable_cpu = RSPAMD_HS_UNCHECKED; + struct rspamd_multipattern { #ifdef WITH_HYPERSCAN @@ -57,15 +62,29 @@ rspamd_multipattern_quark (void) return g_quark_from_static_string ("multipattern"); } +static inline gboolean +rspamd_hs_check (void) +{ +#ifdef WITH_HYPERSCAN + if (G_UNLIKELY (hs_suitable_cpu == RSPAMD_HS_UNCHECKED)) { + if (hs_valid_platform () == HS_SUCCESS) { + hs_suitable_cpu = RSPAMD_HS_SUPPORTED; + } + else { + hs_suitable_cpu = RSPAMD_HS_UNSUPPORTED; + } + } +#endif + + return hs_suitable_cpu == RSPAMD_HS_SUPPORTED; +} + void -rspamd_multipattern_library_init (const gchar *cache_dir, - struct rspamd_cryptobox_library_ctx *crypto_ctx) +rspamd_multipattern_library_init (const gchar *cache_dir) { hs_cache_dir = cache_dir; #ifdef WITH_HYPERSCAN - if (crypto_ctx->cpu_config & CPUID_SSSE3) { - hs_suitable_cpu = TRUE; - } + rspamd_hs_check (); #endif } @@ -284,7 +303,7 @@ rspamd_multipattern_pattern_filter (const gchar *pattern, gsize len, { gchar *ret = NULL; #ifdef WITH_HYPERSCAN - if (hs_suitable_cpu) { + if (rspamd_hs_check ()) { if (flags & RSPAMD_MULTIPATTERN_TLD) { ret = rspamd_multipattern_escape_tld_hyperscan (pattern, len, dst_len); } @@ -323,7 +342,7 @@ rspamd_multipattern_create (enum rspamd_multipattern_flags flags) mp->flags = flags; #ifdef WITH_HYPERSCAN - if (hs_suitable_cpu) { + if (rspamd_hs_check ()) { mp->hs_pats = g_array_new (FALSE, TRUE, sizeof (gchar *)); mp->hs_flags = g_array_new (FALSE, TRUE, sizeof (gint)); mp->hs_ids = g_array_new (FALSE, TRUE, sizeof (gint)); @@ -348,7 +367,7 @@ rspamd_multipattern_create_sized (guint npatterns, mp->flags = flags; #ifdef WITH_HYPERSCAN - if (hs_suitable_cpu) { + if (rspamd_hs_check ()) { mp->hs_pats = g_array_sized_new (FALSE, TRUE, sizeof (gchar *), npatterns); mp->hs_flags = g_array_sized_new (FALSE, TRUE, sizeof (gint), npatterns); mp->hs_ids = g_array_sized_new (FALSE, TRUE, sizeof (gint), npatterns); @@ -383,7 +402,7 @@ rspamd_multipattern_add_pattern_len (struct rspamd_multipattern *mp, g_assert (!mp->compiled); #ifdef WITH_HYPERSCAN - if (hs_suitable_cpu) { + if (rspamd_hs_check ()) { gchar *np; gint fl = HS_FLAG_SOM_LEFTMOST; @@ -522,7 +541,7 @@ rspamd_multipattern_compile (struct rspamd_multipattern *mp, GError **err) g_assert (!mp->compiled); #ifdef WITH_HYPERSCAN - if (hs_suitable_cpu) { + if (rspamd_hs_check ()) { guint i; hs_platform_info_t plt; hs_compile_error_t *hs_errors; @@ -652,7 +671,7 @@ rspamd_multipattern_lookup (struct rspamd_multipattern *mp, cbd.ret = 0; #ifdef WITH_HYPERSCAN - if (hs_suitable_cpu) { + if (rspamd_hs_check ()) { hs_scratch_t *scr = NULL; guint i; @@ -706,7 +725,7 @@ rspamd_multipattern_destroy (struct rspamd_multipattern *mp) if (mp) { #ifdef WITH_HYPERSCAN - if (hs_suitable_cpu) { + if (rspamd_hs_check ()) { gchar *p; if (mp->compiled && mp->cnt > 0) { @@ -755,7 +774,7 @@ rspamd_multipattern_get_pattern (struct rspamd_multipattern *mp, g_assert (index < mp->cnt); #ifdef WITH_HYPERSCAN - if (hs_suitable_cpu) { + if (rspamd_hs_check ()) { return g_array_index (mp->hs_pats, gchar *, index); } #endif @@ -774,3 +793,9 @@ rspamd_multipattern_get_npatterns (struct rspamd_multipattern *mp) return mp->cnt; } + +gboolean +rspamd_multipattern_has_hyperscan (void) +{ + return rspamd_hs_check (); +}
\ No newline at end of file diff --git a/src/libutil/multipattern.h b/src/libutil/multipattern.h index c2f30f321..6a7dd4a88 100644 --- a/src/libutil/multipattern.h +++ b/src/libutil/multipattern.h @@ -61,8 +61,7 @@ typedef gint (*rspamd_multipattern_cb_t) (struct rspamd_multipattern *mp, * Init multipart library and set the appropriate cache dir * @param cache_dir */ -void rspamd_multipattern_library_init (const gchar *cache_dir, - struct rspamd_cryptobox_library_ctx *crypto_ctx); +void rspamd_multipattern_library_init (const gchar *cache_dir); /** * Creates empty multipattern structure @@ -78,8 +77,8 @@ struct rspamd_multipattern *rspamd_multipattern_create ( * @param reserved * @return */ -struct rspamd_multipattern *rspamd_multipattern_create_sized ( - enum rspamd_multipattern_flags flags, guint reserved); +struct rspamd_multipattern *rspamd_multipattern_create_sized (guint reserved, + enum rspamd_multipattern_flags flags); /** * Creates new multipattern structure @@ -153,4 +152,10 @@ guint rspamd_multipattern_get_npatterns (struct rspamd_multipattern *mp); */ void rspamd_multipattern_destroy (struct rspamd_multipattern *mp); +/** + * Returns TRUE if hyperscan is supported + * @return + */ +gboolean rspamd_multipattern_has_hyperscan (void); + #endif /* SRC_LIBUTIL_MULTIPATTERN_H_ */ |