2727#include "fpm_env.h"
2828#include "fpm_cleanup.h"
2929#include "fpm_scoreboard.h"
30+ #include "zend_smart_str.h"
3031
3132struct listening_socket_s {
3233 int refcount ;
@@ -60,38 +61,36 @@ static void fpm_sockets_cleanup(int which, void *arg) /* {{{ */
6061 unsigned socket_set [FPM_ENV_SOCKET_SET_MAX ];
6162 unsigned socket_set_buf = 0 ;
6263 char envname [32 ];
63- char * env_value = 0 ;
64- int p = 0 ;
64+ smart_str env_str = {0 };
6565 struct listening_socket_s * ls = sockets_list .data ;
6666
6767 for (i = 0 ; i < sockets_list .used ; i ++ , ls ++ ) {
6868 if (which != FPM_CLEANUP_PARENT_EXEC ) {
6969 close (ls -> sock );
7070 } else { /* on PARENT EXEC we want socket fds to be inherited through environment variable */
7171 char fd [32 ];
72- char * tmpenv_value ;
7372 snprintf (fd , sizeof (fd ), "%d" , ls -> sock );
7473
7574 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 ;
8475
8576 if (i % FPM_ENV_SOCKET_SET_SIZE == 0 ) {
86- socket_set [socket_set_count ] = p + socket_set_buf ;
77+ socket_set [socket_set_count ] = ( env_str . s ? ZSTR_LEN ( env_str . s ) : 0 ) + socket_set_buf ;
8778 socket_set_count ++ ;
8879 if (i ) {
89- * ( env_value + p + 1 ) = 0 ;
80+ smart_str_appendc ( & env_str , '\0' ) ;
9081 }
9182 }
9283
93- p += sprintf (env_value + p + socket_set_buf , "%s%s=%s" , (p && !socket_set_buf ) ? "," : "" , ls -> key , fd );
94- p += socket_set_buf ;
84+ if (env_str .s && ZSTR_LEN (env_str .s ) && !socket_set_buf ) {
85+ smart_str_appendc (& env_str , ',' );
86+ }
87+ smart_str_appends (& env_str , ls -> key );
88+ smart_str_appendc (& env_str , '=' );
89+ smart_str_appends (& env_str , fd );
90+
91+ if (socket_set_buf ) {
92+ smart_str_appendc (& env_str , '\0' );
93+ }
9594 }
9695
9796 if (which == FPM_CLEANUP_PARENT_EXIT_MAIN ) {
@@ -102,14 +101,15 @@ static void fpm_sockets_cleanup(int which, void *arg) /* {{{ */
102101 free (ls -> key );
103102 }
104103
105- if (env_value ) {
104+ if (env_str .s ) {
105+ smart_str_0 (& env_str );
106106 for (i = 0 ; i < socket_set_count ; i ++ ) {
107107 fpm_sockets_get_env_name (envname , sizeof (envname ), i );
108- setenv (envname , env_value + socket_set [i ], 1 );
108+ setenv (envname , ZSTR_VAL ( env_str . s ) + socket_set [i ], 1 );
109109 }
110110 fpm_sockets_get_env_name (envname , sizeof (envname ), socket_set_count );
111111 unsetenv (envname );
112- free ( env_value );
112+ smart_str_free ( & env_str );
113113 }
114114
115115 fpm_array_free (& sockets_list );
0 commit comments