]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Try to fix cleanup code
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 16 Oct 2021 11:11:46 +0000 (12:11 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 16 Oct 2021 11:11:46 +0000 (12:11 +0100)
src/libserver/re_cache.c

index 91ef2cfa412294d518633e20add069503ea50a55..3016d04c53851303dd320612928473165aee35ea 100644 (file)
@@ -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;