]> source.dussan.org Git - rspamd.git/commitdiff
* Fix strict aliasing while compiling with optimization
authorVsevolod Stakhov <vsevolod@rambler-co.ru>
Mon, 31 May 2010 13:17:13 +0000 (17:17 +0400)
committerVsevolod Stakhov <vsevolod@rambler-co.ru>
Mon, 31 May 2010 13:17:13 +0000 (17:17 +0400)
* Fix tanhl detection for platforms that have not implementation of it
* Remove several compile warnings

17 files changed:
CMakeLists.txt
config.h.in
src/cfg_utils.c
src/cfg_xml.c
src/classifiers/winnow.c
src/evdns/CMakeLists.txt
src/expressions.c
src/lmtp.c
src/logger.c
src/main.h
src/memcached.c
src/plugins/custom/ipmark/ipmark.c
src/settings.c
src/smtp.c
src/statfile.c
src/symbols_cache.c
src/worker.c

index 615cbb52fb22b62f6099c3a028df3c8f33fb8bbf..2337414052c8e2f64d88a16ce1a1c47968525df1 100644 (file)
@@ -280,6 +280,7 @@ CHECK_FUNCTION_EXISTS(vfork HAVE_VFORK)
 CHECK_FUNCTION_EXISTS(wait4 HAVE_WAIT4)
 CHECK_FUNCTION_EXISTS(waitpid HAVE_WAITPID)
 CHECK_FUNCTION_EXISTS(flock HAVE_FLOCK)
+CHECK_FUNCTION_EXISTS(tanhl HAVE_TANHL)
 
 CHECK_SYMBOL_EXISTS(PATH_MAX limits.h HAVE_PATH_MAX)
 CHECK_SYMBOL_EXISTS(MAXPATHLEN sys/param.h HAVE_MAXPATHLEN)
index 99ea39c5bf5a5a28093e45e52a6e8882eb5c14a7..ebb48f50833764fb6ab0f72427c638e8c16726ff 100644 (file)
@@ -96,6 +96,8 @@
 
 #cmakedefine HAVE_FLOCK          1
 
+#cmakedefine HAVE_TANHL          1
+
 #cmakedefine HAVE_SA_SIGINFO     1
 
 #cmakedefine DEBUG_MODE          1
index d63e6bc93e48bf893f963298fed33bacdfaa65c5..21cf5748169199ebcf2daae1214962be603b4937 100644 (file)
@@ -727,7 +727,15 @@ internal_normalizer_func (struct config_file *cfg, long double score, void *data
         return score;
     }
        else {
+#ifdef HAVE_TANHL
                return max * tanhl (score / max);
+#else
+               /* 
+                * As some implementations of libm does not support tanhl, try to use
+                * tanh
+                */
+               return max * tanh ((double) (score / max));
+#endif
        }
 
     return score;
index 18314106b67c31f7314388f97996107543b9d911..f8b3f55ba6b371044020b9ab0828c788d1c75051 100644 (file)
@@ -744,11 +744,12 @@ handle_lua (struct config_file *cfg, struct rspamd_xml_userdata *ctx, GHashTable
                lua_file = basename (tmp2);
                if (lua_dir && lua_file) {
                        cur_dir = g_malloc (PATH_MAX);
-                       getcwd (cur_dir, PATH_MAX);
-                       if (chdir (lua_dir) != -1) {
+                       if (getcwd (cur_dir, PATH_MAX) != NULL && chdir (lua_dir) != -1) {
                                if (luaL_dofile (L, lua_file) != 0) {
                                        msg_err ("cannot load lua file %s: %s", val, lua_tostring (L, -1));
-                                       chdir (cur_dir);
+                                       if (chdir (cur_dir) == -1) {
+                                               msg_err ("cannot chdir to %s: %s", cur_dir, strerror (errno));;
+                                       }
                                        g_free (cur_dir);
                                        g_free (tmp1);
                                        g_free (tmp2);
@@ -757,14 +758,18 @@ handle_lua (struct config_file *cfg, struct rspamd_xml_userdata *ctx, GHashTable
                        }
                        else {
                                msg_err ("cannot chdir to %s: %s", lua_dir, strerror (errno));;
-                               chdir (cur_dir);
+                               if (chdir (cur_dir) == -1) {
+                                       msg_err ("cannot chdir to %s: %s", cur_dir, strerror (errno));;
+                               }
                                g_free (cur_dir);
                                g_free (tmp1);
                                g_free (tmp2);
                                return FALSE;
                        
                        }
-                       chdir (cur_dir);
+                       if (chdir (cur_dir) == -1) {
+                               msg_err ("cannot chdir to %s: %s", cur_dir, strerror (errno));;
+                       }
                        g_free (cur_dir);
                        g_free (tmp1);
                        g_free (tmp2);
@@ -814,9 +819,11 @@ handle_module_path (struct config_file *cfg, struct rspamd_xml_userdata *ctx, GH
                                cfg->script_modules = g_list_prepend (cfg->script_modules, cur);
                        }
                        globfree (&globbuf);
+                       g_free (pattern);
                }
                else {
                        msg_err ("glob failed: %s", strerror (errno));
+                       g_free (pattern);
                        return FALSE;
                }
        }
index 6c64cdc4b539595da080f432d222440ccdb9a7fd..9f66c3cbd4543a7c76b5de2f8e98d0a54c565ab4 100644 (file)
@@ -335,7 +335,7 @@ winnow_learn (struct classifier_ctx *ctx, statfile_pool_t *pool, stat_file_t *fi
        char                           *value;
        int                             nodes, minnodes, iterations = 0;
        struct statfile                *st;
-       stat_file_t                    *sel;
+       stat_file_t                    *sel = NULL;
        long double                     res = 0., max = 0.;
        GList                          *cur;
 
index 338da91a987ea86a79372ac2e18809afcf20f491..aef7f95d222838559f4f7085b87ea0768631d792 100644 (file)
@@ -2,4 +2,4 @@
 SET(EVDNSSRC                     evdns.c)
 
 ADD_LIBRARY(rspamd_evdns STATIC ${EVDNSSRC})
-SET_TARGET_PROPERTIES(rspamd_evdns PROPERTIES COMPILE_FLAGS "-DRSPAMD_LIB")
+SET_TARGET_PROPERTIES(rspamd_evdns PROPERTIES COMPILE_FLAGS "-fno-strict-aliasing -DRSPAMD_LIB")
index 25d9509046e5ff87b1aa2fbbf6962628992d9754..a8d6393253373cdf239cd3551e04603673050fe4 100644 (file)
@@ -1306,9 +1306,10 @@ is_recipient_list_sorted (const InternetAddressList * ia)
                return FALSE;
        }
 #ifdef GMIME24
+       num = internet_address_list_length ((InternetAddressList *)ia);
        cur = ia;
        for (i = 0; i < num; i ++) {
-               addr = internet_address_list_get_address (cur, i);
+               addr = internet_address_list_get_address ((InternetAddressList *)cur, i);
                current.addr = (char *)internet_address_get_name (addr);
                if (previous.addr != NULL) {
                        if (g_ascii_strcasecmp (current.addr, previous.addr) < 0) {
index 9f7a4805af1eeb57168a188db022e560a94bffc7..385debfbb3920e03c6e2569f5f844390895eb8e0 100644 (file)
@@ -224,14 +224,13 @@ static void
 accept_socket (int fd, short what, void *arg)
 {
        struct rspamd_worker           *worker = (struct rspamd_worker *)arg;
-       struct sockaddr_storage         ss;
-       struct sockaddr_in             *sin;
+       union sa_union                  su;
        struct worker_task             *new_task;
        struct rspamd_lmtp_proto       *lmtp;
-       socklen_t                       addrlen = sizeof (ss);
+       socklen_t                       addrlen = sizeof (su.ss);
        int                             nfd;
 
-       if ((nfd = accept_from_socket (fd, (struct sockaddr *)&ss, &addrlen)) == -1) {
+       if ((nfd = accept_from_socket (fd, (struct sockaddr *)&su.ss, &addrlen)) == -1) {
                msg_warn ("accept failed: %s", strerror (errno));
                return;
        }
@@ -240,14 +239,13 @@ accept_socket (int fd, short what, void *arg)
 
        new_task = construct_task (worker);
 
-       if (ss.ss_family == AF_UNIX) {
+       if (su.ss.ss_family == AF_UNIX) {
                msg_info ("accepted connection from unix socket");
                new_task->client_addr.s_addr = INADDR_NONE;
        }
-       else if (ss.ss_family == AF_INET) {
-               sin = (struct sockaddr_in *)&ss;
-               msg_info ("accepted connection from %s port %d", inet_ntoa (sin->sin_addr), ntohs (sin->sin_port));
-               memcpy (&new_task->client_addr, &sin->sin_addr, sizeof (struct in_addr));
+       else if (su.ss.ss_family == AF_INET) {
+               msg_info ("accepted connection from %s port %d", inet_ntoa (su.s4.sin_addr), ntohs (su.s4.sin_port));
+               memcpy (&new_task->client_addr, &su.s4.sin_addr, sizeof (struct in_addr));
        }
 
        new_task->sock = nfd;
index a27cc27fc0fc929ca386560329ad2546e90daa03..282506df48cd2b868a49138a2e643321b68a2b67 100644 (file)
@@ -118,7 +118,10 @@ direct_write_log_line (void *data, int count, gboolean is_iov)
                        }
                        else if (errno == EFAULT || errno == EINVAL || errno == EFBIG || errno == ENOSPC) {
                                /* Rare case */
-                               (void)write (rspamd_log->fd, errmsg, r);
+                               if (write (rspamd_log->fd, errmsg, r) == -1) {
+                                       /* Don't know what to do */
+                                       exit (EXIT_FAILURE);
+                               }
                        }
                        else if (errno == EPIPE) {
                                /* We write to some pipe and it disappears, disable logging */
index 49d18aad260500d6443bcdb30fa5af6d7d26fc41..9371652d329a8695101fd9f25bb47fc0484d29e4 100644 (file)
@@ -122,6 +122,14 @@ struct save_point {
 };
 
 
+/**
+ * Union that would be used for storing sockaddrs
+ */
+union sa_union {
+  struct sockaddr_storage ss;
+  struct sockaddr_in s4;
+  struct sockaddr_in6 s6;
+};
 
 /**
  * Control session object
index fc71529403102e299d9ac51b3afa82a2d407bf65..77078aa064e352ddee664c3bc9c48d9beee1817b 100644 (file)
@@ -139,7 +139,9 @@ write_handler (int fd, short what, memcached_ctx_t * ctx)
                        iov[1].iov_len = ctx->param->bufsize - ctx->param->bufpos;
                        iov[2].iov_base = CRLF;
                        iov[2].iov_len = sizeof (CRLF) - 1;
-                       writev (ctx->sock, iov, 3);
+                       if (writev (ctx->sock, iov, 3) == -1) {
+                               memc_log (ctx, __LINE__, "memc_write: writev failed: %s", strerror (errno));
+                       }
                }
                event_del (&ctx->mem_ev);
                event_set (&ctx->mem_ev, ctx->sock, EV_READ | EV_PERSIST | EV_TIMEOUT, socket_callback, (void *)ctx);
index 9bebcab22d22efcbed73fc0e4ec5ea3e903bca15..f6d32b6ac19f78e0ac1eadba7a1092b8be7fd704 100644 (file)
@@ -175,7 +175,7 @@ read_radix_file (void)
        FILE *f;
        char buf[BUFSIZ];
        struct in_addr ina;
-       int mask, value;
+       int mask = 0, value = 0;
 
        f = fopen (filename, "r");
        if (f != NULL) {
@@ -260,9 +260,9 @@ parse_line (const char *line, size_t len, char **output, void *user_data)
        char *c = ip_buf, *err_str;
        struct in_addr ina;
        int state = 0, next_state = 0, dots = 0;
-       int16_t value;
+       int16_t value = 0;
        uint32_t mask;
-       enum ipmark_command cmd;
+       enum ipmark_command cmd = COMMAND_ADD;
 
        /* Parse input line */
        p = line;
index cd7167eddc88153e26a743e6dbb618940bdf02db..dd4127c19e773afbc6f1eceef303d822bd4b4465 100644 (file)
@@ -344,7 +344,7 @@ check_whitelist(struct worker_task *task, struct rspamd_settings *s)
 gboolean
 check_metric_settings (struct worker_task * task, struct metric * metric, double *score, double *rscore)
 {
-       struct rspamd_settings         *us, *ds;
+       struct rspamd_settings         *us = NULL, *ds = NULL;
        double                         *sc, *rs;
 
        *rscore = DEFAULT_REJECT_SCORE;
@@ -393,7 +393,7 @@ check_metric_settings (struct worker_task * task, struct metric * metric, double
 gboolean
 check_factor_settings (struct worker_task * task, const char *symbol, double *factor)
 {
-       struct rspamd_settings         *us, *ds;
+       struct rspamd_settings         *us = NULL, *ds = NULL;
        double                         *fc;
 
        if (check_setting (task, &us, &ds)) {
@@ -425,7 +425,7 @@ check_factor_settings (struct worker_task * task, const char *symbol, double *fa
 gboolean
 check_want_spam (struct worker_task * task)
 {
-       struct rspamd_settings         *us, *ds;
+       struct rspamd_settings         *us = NULL, *ds = NULL;
 
        if (check_setting (task, &us, &ds)) {
                if (us != NULL) {
index 116089ee1ac7dcf12fc84691b2354ec05dcefb43..fc2811bed63c703dbe340a8836a8fac28eadc096 100644 (file)
@@ -326,14 +326,13 @@ static void
 accept_socket (int fd, short what, void *arg)
 {
        struct rspamd_worker           *worker = (struct rspamd_worker *)arg;
-       struct sockaddr_storage         ss;
-       struct sockaddr_in             *sin;
+       union sa_union                  su;
        struct smtp_session            *session;
 
-       socklen_t                       addrlen = sizeof (ss);
+       socklen_t                       addrlen = sizeof (su.ss);
        int                             nfd;
 
-       if ((nfd = accept_from_socket (fd, (struct sockaddr *)&ss, &addrlen)) == -1) {
+       if ((nfd = accept_from_socket (fd, (struct sockaddr *)&su.ss, &addrlen)) == -1) {
                msg_warn ("accept failed: %s", strerror (errno));
                return;
        }
@@ -345,14 +344,13 @@ accept_socket (int fd, short what, void *arg)
        session = g_malloc (sizeof (struct smtp_session));
        session->pool = memory_pool_new (memory_pool_get_size ());
 
-       if (ss.ss_family == AF_UNIX) {
+       if (su.ss.ss_family == AF_UNIX) {
                msg_info ("accepted connection from unix socket");
                session->client_addr.s_addr = INADDR_NONE;
        }
-       else if (ss.ss_family == AF_INET) {
-               sin = (struct sockaddr_in *)&ss;
-               msg_info ("accepted connection from %s port %d", inet_ntoa (sin->sin_addr), ntohs (sin->sin_port));
-               memcpy (&session->client_addr, &sin->sin_addr, sizeof (struct in_addr));
+       else if (su.ss.ss_family == AF_INET) {
+               msg_info ("accepted connection from %s port %d", inet_ntoa (su.s4.sin_addr), ntohs (su.s4.sin_port));
+               memcpy (&session->client_addr, &su.s4.sin_addr, sizeof (struct in_addr));
        }
 
        session->sock = nfd;
@@ -380,7 +378,7 @@ static void
 parse_smtp_banner (struct smtp_worker_ctx *ctx, const char *line)
 {
        int                             hostmax, banner_len = sizeof ("220 ") - 1;
-       char                           *p, *t, *hostbuf;
+       char                           *p, *t, *hostbuf = NULL;
        gboolean                        has_crlf = FALSE;
 
        p = (char *)line;
index 005ea7c8a23a7ce503b88f4d1af847c99167b25a..08b2710657ea947b735f02c49a1e0e903b7ed646 100644 (file)
@@ -418,7 +418,7 @@ statfile_pool_create (statfile_pool_t * pool, char *filename, size_t size)
        };
        struct stat_file_block          block = { 0, 0, 0 };
        int                             fd;
-       unsigned int                    buflen, nblocks;
+       unsigned int                    buflen = 0, nblocks;
        char                           *buf = NULL;
 
        if (statfile_pool_is_open (pool, filename) != NULL) {
index f1589226a04324ae1977b63118e1822a713ad925..a632152e437e35b293ca6edf074e560ba3e24c0f 100644 (file)
@@ -525,7 +525,7 @@ call_symbol_callback (struct worker_task * task, struct symbols_cache * cache, g
 {
        struct timespec                 ts1, ts2;
        uint64_t                        diff;
-       struct cache_item              *item;
+       struct cache_item              *item = NULL;
        struct symbol_callback_data    *s = *save;
 
        if (s == NULL) {
index 115c3be11b528467946699bce32c9d41fc2a29ad..5ebdaf84b3fcf29679e8d08db188abf33f4fcaf5 100644 (file)
@@ -443,16 +443,15 @@ static void
 accept_socket (int fd, short what, void *arg)
 {
        struct rspamd_worker           *worker = (struct rspamd_worker *)arg;
-       struct sockaddr_storage         ss;
-       struct sockaddr_in             *sin;
+       union sa_union                  su;
        struct worker_task             *new_task;
        GList                          *cur;
        struct custom_filter           *filt;
 
-       socklen_t                       addrlen = sizeof (ss);
+       socklen_t                       addrlen = sizeof (su.ss);
        int                             nfd;
 
-       if ((nfd = accept_from_socket (fd, (struct sockaddr *)&ss, &addrlen)) == -1) {
+       if ((nfd = accept_from_socket (fd, (struct sockaddr *)&su.ss, &addrlen)) == -1) {
                msg_warn ("accept failed: %s", strerror (errno));
                return;
        }
@@ -463,14 +462,13 @@ accept_socket (int fd, short what, void *arg)
        
        new_task = construct_task (worker);
 
-       if (ss.ss_family == AF_UNIX) {
+       if (su.ss.ss_family == AF_UNIX) {
                msg_info ("accepted connection from unix socket");
                new_task->client_addr.s_addr = INADDR_NONE;
        }
-       else if (ss.ss_family == AF_INET) {
-               sin = (struct sockaddr_in *)&ss;
-               msg_info ("accepted connection from %s port %d", inet_ntoa (sin->sin_addr), ntohs (sin->sin_port));
-               memcpy (&new_task->client_addr, &sin->sin_addr, sizeof (struct in_addr));
+       else if (su.ss.ss_family == AF_INET) {
+               msg_info ("accepted connection from %s port %d", inet_ntoa (su.s4.sin_addr), ntohs (su.s4.sin_port));
+               memcpy (&new_task->client_addr, &su.s4.sin_addr, sizeof (struct in_addr));
        }
 
        new_task->sock = nfd;