]> granicus.if.org Git - php/commitdiff
- Fixed bug #62153 (when using unix sockets, multiples FPM instances can be launched...
authorJerome Loyet <fat@php.net>
Fri, 25 May 2012 19:21:44 +0000 (21:21 +0200)
committerJerome Loyet <fat@php.net>
Fri, 25 May 2012 19:21:44 +0000 (21:21 +0200)
NEWS
sapi/fpm/fpm/fpm_sockets.c
sapi/fpm/fpm/fpm_sockets.h

diff --git a/NEWS b/NEWS
index bb6a36ea1872cd12842ec54df7e3fb809b1c5681..60991b605bdfb063a7b1e219cd3a96b43a0ff661 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -15,6 +15,8 @@ PHP                                                                        NEWS
   . Fixed bug #61026 (FPM pools can listen on the same address). (fat)
   . Fixed bug #62033 (php-fpm exits with status 0 on some failures to start).
     (fat)
+  . Fixed bug #62153 (when using unix sockets, multiples FPM instances
+    can be launched without errors). (fat)
 
 - Intl:
   . Fixed bug #62083 (grapheme_extract() memory leaks). (Gustavo)
index cb4897e9b408b9b5099a15790326e6eaafbe35aa..d24dcccc9af5f1817d205d1809da8abf0097d69e 100644 (file)
@@ -179,6 +179,10 @@ static int fpm_sockets_new_listening_socket(struct fpm_worker_pool_s *wp, struct
        setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &flags, sizeof(flags));
 
        if (wp->listen_address_domain == FPM_AF_UNIX) {
+               if (fpm_socket_unix_test_connect((struct sockaddr_un *)sa, socklen) == 0) {
+                       zlog(ZLOG_ERROR, "An another FPM instance seems to already listen on %s", ((struct sockaddr_un *) sa)->sun_path);
+                       return -1;
+               }
                unlink( ((struct sockaddr_un *) sa)->sun_path);
                saved_umask = umask(0777 ^ wp->socket_mode);
        }
@@ -450,3 +454,24 @@ int fpm_socket_get_listening_queue(int sock, unsigned *cur_lq, unsigned *max_lq)
 }
 
 #endif
+
+int fpm_socket_unix_test_connect(struct sockaddr_un *sun, size_t socklen) /* {{{ */
+{
+       int fd;
+
+       if (!sun || sun->sun_family != AF_UNIX) {
+               return -1;
+       }
+
+       if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
+               return -1;
+       }
+
+       if (connect(fd, (struct sockaddr *)sun, socklen) == -1) {
+               return -1;
+       }
+
+       close(fd);
+       return 0;
+}
+/* }}} */
index 447fbff4b245b04098a8e37446f49fdedb7ecee9..b7ff0b2296e7704d63aacb96a8998520ecb7a3f7 100644 (file)
@@ -22,6 +22,7 @@
 enum fpm_address_domain fpm_sockets_domain_from_address(char *addr);
 int fpm_sockets_init_main();
 int fpm_socket_get_listening_queue(int sock, unsigned *cur_lq, unsigned *max_lq);
+int fpm_socket_unix_test_connect(struct sockaddr_un *sun, size_t socklen);
 
 
 static inline int fd_set_blocked(int fd, int blocked) /* {{{ */