2727#include "fpm_env.h"
2828#include "fpm_cleanup.h"
2929#include "fpm_scoreboard.h"
30- #include "zend_smart_string.h"
3130
3231struct listening_socket_s {
3332 int refcount ;
@@ -59,24 +58,40 @@ static void fpm_sockets_cleanup(int which, void *arg) /* {{{ */
5958 unsigned i ;
6059 unsigned socket_set_count = 0 ;
6160 unsigned socket_set [FPM_ENV_SOCKET_SET_MAX ];
61+ unsigned socket_set_buf = 0 ;
6262 char envname [32 ];
63- smart_string env_str = {0 };
63+ char * env_value = 0 ;
64+ int p = 0 ;
6465 struct listening_socket_s * ls = sockets_list .data ;
6566
6667 for (i = 0 ; i < sockets_list .used ; i ++ , ls ++ ) {
6768 if (which != FPM_CLEANUP_PARENT_EXEC ) {
6869 close (ls -> sock );
6970 } else { /* on PARENT EXEC we want socket fds to be inherited through environment variable */
71+ char fd [32 ];
72+ char * tmpenv_value ;
73+ snprintf (fd , sizeof (fd ), "%d" , ls -> sock );
74+
75+ socket_set_buf = (i % FPM_ENV_SOCKET_SET_SIZE == 0 && i ) ? 1 : 0 ;
76+ tmpenv_value = realloc (env_value , p + (p ? 1 : 0 ) + strlen (ls -> key ) + 1 + strlen (fd ) + socket_set_buf + 1 );
77+ if (!tmpenv_value ) {
78+ zlog (ZLOG_SYSERROR , "failure to inherit data on parent exec for socket `%s` due to memory allocation failure" , ls -> key );
79+ free (ls -> key );
80+ break ;
81+ }
82+
83+ env_value = tmpenv_value ;
84+
7085 if (i % FPM_ENV_SOCKET_SET_SIZE == 0 ) {
71- smart_string_appendc (& env_str , '\0' );
72- socket_set [socket_set_count ] = env_str .len ;
86+ socket_set [socket_set_count ] = p + socket_set_buf ;
7387 socket_set_count ++ ;
74- } else {
75- smart_string_appendc (& env_str , ',' );
88+ if (i ) {
89+ * (env_value + p + 1 ) = 0 ;
90+ }
7691 }
77- smart_string_appends ( & env_str , ls -> key );
78- smart_string_appendc ( & env_str , '=' );
79- smart_string_append_long ( & env_str , ls -> sock ) ;
92+
93+ p += sprintf ( env_value + p + socket_set_buf , "%s%s=%s" , ( p && ! socket_set_buf ) ? "," : "" , ls -> key , fd );
94+ p += socket_set_buf ;
8095 }
8196
8297 if (which == FPM_CLEANUP_PARENT_EXIT_MAIN ) {
@@ -87,15 +102,14 @@ static void fpm_sockets_cleanup(int which, void *arg) /* {{{ */
87102 free (ls -> key );
88103 }
89104
90- if (env_str .c ) {
91- smart_string_appendc (& env_str , '\0' );
105+ if (env_value ) {
92106 for (i = 0 ; i < socket_set_count ; i ++ ) {
93107 fpm_sockets_get_env_name (envname , sizeof (envname ), i );
94- setenv (envname , env_str . c + socket_set [i ], 1 );
108+ setenv (envname , env_value + socket_set [i ], 1 );
95109 }
96110 fpm_sockets_get_env_name (envname , sizeof (envname ), socket_set_count );
97111 unsetenv (envname );
98- smart_string_free ( & env_str );
112+ free ( env_value );
99113 }
100114
101115 fpm_array_free (& sockets_list );
0 commit comments