]> source.dussan.org Git - rspamd.git/commitdiff
[Project] Do not listen sockets in the main process
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 9 Jun 2020 13:36:07 +0000 (14:36 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 9 Jun 2020 13:36:07 +0000 (14:36 +0100)
src/libserver/worker_util.c
src/libutil/addr.c
src/libutil/addr.h
src/rspamd.c

index d5e603cfacde118631a135db2bf3fd48f8cc331e..f1afcce0fc5a64fdfd33418492b8fe00bfd5a350 100644 (file)
@@ -936,13 +936,24 @@ rspamd_main_heartbeat_start (struct rspamd_worker *wrk, struct ev_loop *event_lo
 static bool
 rspamd_maybe_reuseport_socket (struct rspamd_worker_listen_socket *ls)
 {
-       if (ls->fd == -1 || ls->is_systemd ||
-               rspamd_inet_address_get_af (ls->addr) == AF_UNIX) {
-               return false;
+       gint nfd = -1;
+
+       if (ls->fd == -1 || ls->is_systemd) {
+               /* No need to reuseport */
+               return true;
+       }
+
+       if (rspamd_inet_address_get_af (ls->addr) == AF_UNIX) {
+               /* Just try listen */
+
+               if (listen (ls->fd, -1) == -1) {
+                       return false;
+               }
+
+               return true;
        }
 
 #if defined(SO_REUSEPORT) && defined(SO_REUSEADDR)
-       gint nfd;
 
        nfd = rspamd_inet_address_listen (ls->addr,
                        (ls->type == RSPAMD_WORKER_SOCKET_UDP ? SOCK_DGRAM : SOCK_STREAM),
@@ -952,16 +963,25 @@ rspamd_maybe_reuseport_socket (struct rspamd_worker_listen_socket *ls)
        if (nfd == -1) {
                msg_warn ("cannot create reuseport listen socket for %d: %s",
                                ls->fd, strerror (errno));
+               nfd = ls->fd;
        }
        else {
                close (ls->fd);
                ls->fd = nfd;
+               nfd = -1;
        }
 #else
-
+       nfd = ls->fd;
 #endif
 
-       return false;
+       /* This means that we have an fd with no listening enabled */
+       if (nfd != -1) {
+               if (listen (nfd, -1) == -1) {
+                       return false;
+               }
+       }
+
+       return true;
 }
 
 /**
index b43f7cf032681f35573915a247279cdcc1d8a457..bb98dbee26696bffe67cab6f72c812fcb2666967 100644 (file)
@@ -1114,34 +1114,36 @@ rspamd_inet_address_listen (const rspamd_inet_addr_t *addr, gint type,
                }
        }
 
-       if (type != (int)SOCK_DGRAM) {
+       if (addr->af == AF_UNIX) {
+               path = addr->u.un->addr.sun_path;
+               /* Try to set mode and owner */
 
-               if (addr->af == AF_UNIX) {
-                       path = addr->u.un->addr.sun_path;
-                       /* Try to set mode and owner */
-
-                       if (addr->u.un->owner != (uid_t)-1 || addr->u.un->group != (gid_t)-1) {
-                               if (chown (path, addr->u.un->owner, addr->u.un->group) == -1) {
-                                       msg_info ("cannot change owner for %s to %d:%d: %s",
-                                                       path, addr->u.un->owner, addr->u.un->group,
-                                                       strerror (errno));
-                               }
+               if (addr->u.un->owner != (uid_t)-1 || addr->u.un->group != (gid_t)-1) {
+                       if (chown (path, addr->u.un->owner, addr->u.un->group) == -1) {
+                               msg_info ("cannot change owner for %s to %d:%d: %s",
+                                               path, addr->u.un->owner, addr->u.un->group,
+                                               strerror (errno));
                        }
+               }
 
-                       if (chmod (path, addr->u.un->mode) == -1) {
-                               msg_info ("cannot change mode for %s to %od %s",
-                                               path, addr->u.un->mode, strerror (errno));
-                       }
+               if (chmod (path, addr->u.un->mode) == -1) {
+                       msg_info ("cannot change mode for %s to %od %s",
+                                       path, addr->u.un->mode, strerror (errno));
                }
+       }
 
-               r = listen (fd, listen_queue);
+       if (type != (int)SOCK_DGRAM) {
 
-               if (r == -1) {
-                       msg_warn ("listen %s failed: %d, '%s'",
-                                       rspamd_inet_address_to_string_pretty (addr),
-                                       errno, strerror (errno));
+               if (!(opts & RSPAMD_INET_ADDRESS_LISTEN_NOLISTEN)) {
+                       r = listen (fd, listen_queue);
 
-                       goto err;
+                       if (r == -1) {
+                               msg_warn ("listen %s failed: %d, '%s'",
+                                               rspamd_inet_address_to_string_pretty (addr),
+                                               errno, strerror (errno));
+
+                               goto err;
+                       }
                }
        }
 
index 852e43b60396760c62c78324c9cfffb9f73bd099..483ad9434990dd07e535a5b6f34442e2ed41d698 100644 (file)
@@ -232,6 +232,7 @@ enum rspamd_inet_address_listen_opts {
        RSPAMD_INET_ADDRESS_LISTEN_DEFAULT = 0,
        RSPAMD_INET_ADDRESS_LISTEN_ASYNC = (1u << 0u),
        RSPAMD_INET_ADDRESS_LISTEN_REUSEPORT = (1u << 1u),
+       RSPAMD_INET_ADDRESS_LISTEN_NOLISTEN = (1u << 2u),
 };
 /**
  * Listen on a specified inet address
index 2f86739b65f0d1824cd17965e363b8f8f6b5933d..7ea403258eb033c6dcfd3d1dc33d773b944b69fe 100644 (file)
@@ -402,6 +402,9 @@ create_listen_socket (GPtrArray *addrs, guint cnt,
        GList *result = NULL;
        gint fd;
        guint i;
+       static const int listen_opts = RSPAMD_INET_ADDRESS_LISTEN_ASYNC|
+                                                                  RSPAMD_INET_ADDRESS_LISTEN_REUSEPORT|
+                                                                  RSPAMD_INET_ADDRESS_LISTEN_NOLISTEN;
        struct rspamd_worker_listen_socket *ls;
 
        g_ptr_array_sort (addrs, rspamd_inet_address_compare_ptr);
@@ -413,7 +416,7 @@ create_listen_socket (GPtrArray *addrs, guint cnt,
                if (listen_type & RSPAMD_WORKER_SOCKET_TCP) {
                        fd = rspamd_inet_address_listen (g_ptr_array_index (addrs, i),
                                        SOCK_STREAM,
-                                       RSPAMD_INET_ADDRESS_LISTEN_ASYNC|RSPAMD_INET_ADDRESS_LISTEN_REUSEPORT, -1);
+                                       listen_opts, -1);
                        if (fd != -1) {
                                ls = g_malloc0 (sizeof (*ls));
                                ls->addr = rspamd_inet_address_copy (g_ptr_array_index (addrs, i));
@@ -425,7 +428,7 @@ create_listen_socket (GPtrArray *addrs, guint cnt,
                if (listen_type & RSPAMD_WORKER_SOCKET_UDP) {
                        fd = rspamd_inet_address_listen (g_ptr_array_index (addrs, i),
                                        SOCK_DGRAM,
-                                       RSPAMD_INET_ADDRESS_LISTEN_ASYNC|RSPAMD_INET_ADDRESS_LISTEN_REUSEPORT, -1);
+                                       listen_opts, -1);
                        if (fd != -1) {
                                ls = g_malloc0 (sizeof (*ls));
                                ls->addr = rspamd_inet_address_copy (g_ptr_array_index (addrs, i));