commit 711b8dc: [Minor] Try to fix cleanup code
Vsevolod Stakhov
vsevolod at highsecure.ru
Sat Oct 16 12:07:04 UTC 2021
Author: Vsevolod Stakhov
Date: 2021-10-16 12:11:46 +0100
URL: https://github.com/rspamd/rspamd/commit/711b8dcb02936a6c769d922d0f0e800cb398b8a3
[Minor] Try to fix cleanup code
---
src/libserver/re_cache.c | 63 ++++++++++++++++++------------------------------
1 file changed, 23 insertions(+), 40 deletions(-)
diff --git a/src/libserver/re_cache.c b/src/libserver/re_cache.c
index 91ef2cfa4..3016d04c5 100644
--- a/src/libserver/re_cache.c
+++ b/src/libserver/re_cache.c
@@ -1892,7 +1892,7 @@ rspamd_re_cache_compile_timer_cb (EV_P_ ev_timer *w, int revents )
rspamd_cryptobox_fast_hash_state_t crc_st;
guint64 crc;
rspamd_regexp_t *re;
- hs_compile_error_t *hs_errors;
+ hs_compile_error_t *hs_errors = NULL;
guint *hs_flags = NULL;
const hs_expr_ext_t **hs_exts = NULL;
gchar **hs_pats = NULL;
@@ -2052,8 +2052,24 @@ rspamd_re_cache_compile_timer_cb (EV_P_ ev_timer *w, int revents )
/* Adjust real re number */
n = i;
+#define CLEANUP_ALLOCATED(is_err) do { \
+ g_free (hs_flags); \
+ g_free (hs_ids); \
+ for (guint j = 0; j < i; j ++) { \
+ g_free (hs_pats[j]); \
+ } \
+ g_free (hs_pats); \
+ g_free (hs_exts); \
+ if (is_err) { \
+ close (fd); \
+ unlink (path); \
+ if (hs_errors) hs_free_compile_error (hs_errors); \
+ } \
+} while(0)
+
if (n > 0) {
/* Create the hs tree */
+ hs_errors = NULL;
if (hs_compile_ext_multi ((const char **)hs_pats,
hs_flags,
hs_ids,
@@ -2064,35 +2080,15 @@ rspamd_re_cache_compile_timer_cb (EV_P_ ev_timer *w, int revents )
&test_db,
&hs_errors) != HS_SUCCESS) {
-
- g_free (hs_flags);
- g_free (hs_ids);
-
- for (guint j = 0; j < i; j ++) {
- g_free (hs_pats[j]);
- }
-
err = g_error_new (rspamd_re_cache_quark (), EINVAL,
"cannot create tree of regexp when processing '%s': %s",
hs_pats[hs_errors->expression], hs_errors->message);
- g_free (hs_pats);
- g_free (hs_exts);
- close (fd);
- unlink (path);
- hs_free_compile_error (hs_errors);
-
+ CLEANUP_ALLOCATED(true);
rspamd_re_cache_compile_err (EV_A_ w, err, cbdata, false);
return;
}
- for (guint j = 0; j < i; j ++) {
- g_free (hs_pats[j]);
- }
-
- g_free (hs_pats);
- g_free (hs_exts);
-
if (hs_serialize_database (test_db, &hs_serialized,
&serialized_len) != HS_SUCCESS) {
err = g_error_new (rspamd_re_cache_quark (),
@@ -2100,12 +2096,8 @@ rspamd_re_cache_compile_timer_cb (EV_P_ ev_timer *w, int revents )
"cannot serialize tree of regexp for %s",
re_class->hash);
- close (fd);
- unlink (path);
- g_free (hs_ids);
- g_free (hs_flags);
+ CLEANUP_ALLOCATED(true);
hs_free_database (test_db);
-
rspamd_re_cache_compile_err (EV_A_ w, err, cbdata, false);
return;
}
@@ -2157,10 +2149,8 @@ rspamd_re_cache_compile_timer_cb (EV_P_ ev_timer *w, int revents )
errno,
"cannot serialize tree of regexp to %s: %s",
path, strerror (errno));
- close (fd);
- unlink (path);
- g_free (hs_ids);
- g_free (hs_flags);
+
+ CLEANUP_ALLOCATED(true);
g_free (hs_serialized);
rspamd_re_cache_compile_err (EV_A_ w, err, cbdata, false);
@@ -2187,10 +2177,7 @@ rspamd_re_cache_compile_timer_cb (EV_P_ ev_timer *w, int revents )
}
cbdata->total += n;
-
- g_free (hs_serialized);
- g_free (hs_ids);
- g_free (hs_flags);
+ CLEANUP_ALLOCATED(false);
/* Now rename temporary file to the new .hs file */
rspamd_snprintf (npath, sizeof (npath), "%s%c%s.hs", cbdata->cache_dir,
@@ -2219,11 +2206,7 @@ rspamd_re_cache_compile_timer_cb (EV_P_ ev_timer *w, int revents )
(gint)g_hash_table_size (re_class->re),
path);
- g_free (hs_serialized);
- g_free (hs_ids);
- g_free (hs_flags);
- unlink (path);
- close (fd);
+ CLEANUP_ALLOCATED(true);
rspamd_re_cache_compile_err (EV_A_ w, err, cbdata, false);
return;
More information about the Commits
mailing list