@@ -112,8 +112,17 @@ static php_process_env_t _php_array_to_envp(zval *environment, int is_persistent
112
112
zend_hash_get_current_data_ex (target_hash , (void * * ) & element , & pos ) == SUCCESS ;
113
113
zend_hash_move_forward_ex (target_hash , & pos )) {
114
114
115
- convert_to_string_ex (element );
116
- el_len = Z_STRLEN_PP (element );
115
+ if (Z_TYPE_PP (element ) != IS_STRING ) {
116
+ zval tmp ;
117
+
118
+ MAKE_COPY_ZVAL (element , & tmp );
119
+ convert_to_string (& tmp );
120
+ el_len = Z_STRLEN (tmp );
121
+
122
+ zval_dtor (& tmp );
123
+ } else {
124
+ el_len = Z_STRLEN_PP (element );
125
+ }
117
126
if (el_len == 0 ) {
118
127
continue ;
119
128
}
@@ -125,7 +134,7 @@ static php_process_env_t _php_array_to_envp(zval *environment, int is_persistent
125
134
if (string_length == 0 ) {
126
135
continue ;
127
136
}
128
- sizeenv += string_length + 1 ;
137
+ sizeenv += string_length ;
129
138
break ;
130
139
}
131
140
}
@@ -138,19 +147,26 @@ static php_process_env_t _php_array_to_envp(zval *environment, int is_persistent
138
147
for (zend_hash_internal_pointer_reset_ex (target_hash , & pos );
139
148
zend_hash_get_current_data_ex (target_hash , (void * * ) & element , & pos ) == SUCCESS ;
140
149
zend_hash_move_forward_ex (target_hash , & pos )) {
150
+ zval tmp ;
141
151
142
- convert_to_string_ex (element );
143
- el_len = Z_STRLEN_PP (element );
152
+ if (Z_TYPE_PP (element ) != IS_STRING ) {
153
+ MAKE_COPY_ZVAL (element , & tmp );
154
+ convert_to_string (& tmp );
155
+ } else {
156
+ tmp = * * element ;
157
+ }
158
+
159
+ el_len = Z_STRLEN (tmp );
144
160
145
161
if (el_len == 0 ) {
146
- continue ;
162
+ goto next_element ;
147
163
}
148
164
149
- data = Z_STRVAL_PP ( element );
165
+ data = Z_STRVAL ( tmp );
150
166
switch (zend_hash_get_current_key_ex (target_hash , & string_key , & string_length , & num_key , 0 , & pos )) {
151
167
case HASH_KEY_IS_STRING :
152
168
if (string_length == 0 ) {
153
- continue ;
169
+ goto next_element ;
154
170
}
155
171
156
172
l = string_length + el_len + 1 ;
@@ -175,6 +191,11 @@ static php_process_env_t _php_array_to_envp(zval *environment, int is_persistent
175
191
case HASH_KEY_NON_EXISTENT :
176
192
break ;
177
193
}
194
+
195
+ next_element :
196
+ if (Z_TYPE_PP (element ) != IS_STRING ) {
197
+ zval_dtor (& tmp );
198
+ }
178
199
}
179
200
180
201
assert ((uint )(p - env .envp ) <= sizeenv );
0 commit comments