@@ -78,13 +78,11 @@ static php_process_env_t _php_array_to_envp(zval *environment, int is_persistent
78
78
zval * element ;
79
79
php_process_env_t env ;
80
80
zend_string * string_key ;
81
- char * data ;
82
81
#ifndef PHP_WIN32
83
82
char * * ep ;
84
83
#endif
85
84
char * p ;
86
- uint cnt , l , sizeenv = 0 , el_len ;
87
- ulong num_key ;
85
+ uint cnt , l , sizeenv = 0 ;
88
86
HashTable * target_hash ;
89
87
90
88
memset (& env , 0 , sizeof (env ));
@@ -109,22 +107,16 @@ static php_process_env_t _php_array_to_envp(zval *environment, int is_persistent
109
107
}
110
108
111
109
/* first, we have to get the size of all the elements in the hash */
112
- ZEND_HASH_FOREACH_KEY_VAL (target_hash , num_key , string_key , element ) {
113
- zval tmp ;
114
-
115
- if (Z_TYPE_P (element ) != IS_STRING ) {
116
- ZVAL_DUP (& tmp , element );
117
- convert_to_string (& tmp );
118
- el_len = Z_STRLEN (tmp );
119
- zval_dtor (& tmp );
120
- } else {
121
- el_len = Z_STRLEN_P (element );
122
- }
110
+ ZEND_HASH_FOREACH_STR_KEY_VAL (target_hash , string_key , element ) {
111
+ zend_string * str = zval_get_string (element );
112
+ uint el_len = str -> len ;
113
+ STR_RELEASE (str );
114
+
123
115
if (el_len == 0 ) {
124
116
continue ;
125
117
}
126
118
127
- sizeenv += el_len + 1 ;
119
+ sizeenv += el_len + 1 ;
128
120
129
121
if (string_key ) {
130
122
if (string_key -> len == 0 ) {
@@ -139,51 +131,38 @@ static php_process_env_t _php_array_to_envp(zval *environment, int is_persistent
139
131
#endif
140
132
p = env .envp = (char * ) pecalloc (sizeenv + 4 , 1 , is_persistent );
141
133
142
- ZEND_HASH_FOREACH_KEY_VAL (target_hash , num_key , string_key , element ) {
143
- zval tmp ;
144
-
145
- if (Z_TYPE_P (element ) != IS_STRING ) {
146
- ZVAL_DUP (& tmp , element );
147
- convert_to_string (& tmp );
148
- } else {
149
- ZVAL_COPY_VALUE (& tmp , element );
150
- }
151
-
152
- el_len = Z_STRLEN (tmp );
134
+ ZEND_HASH_FOREACH_STR_KEY_VAL (target_hash , string_key , element ) {
135
+ zend_string * str = zval_get_string (element );
153
136
154
- if (el_len == 0 ) {
137
+ if (str -> len == 0 ) {
155
138
goto next_element ;
156
139
}
157
140
158
- data = Z_STRVAL (tmp );
159
-
160
141
if (string_key ) {
161
142
if (string_key -> len == 0 ) {
162
143
goto next_element ;
163
144
}
164
145
165
- l = string_key -> len + el_len + 2 ;
146
+ l = string_key -> len + str -> len + 2 ;
166
147
memcpy (p , string_key -> val , string_key -> len );
167
148
strncat (p , "=" , 1 );
168
- strncat (p , data , el_len );
149
+ strncat (p , str -> val , str -> len );
169
150
170
151
#ifndef PHP_WIN32
171
152
* ep = p ;
172
153
++ ep ;
173
154
#endif
174
155
p += l ;
175
156
} else {
176
- memcpy (p ,data , el_len );
157
+ memcpy (p , str -> val , str -> len );
177
158
#ifndef PHP_WIN32
178
159
* ep = p ;
179
160
++ ep ;
180
161
#endif
181
- p += el_len + 1 ;
162
+ p += str -> len + 1 ;
182
163
}
183
164
next_element :
184
- if (Z_TYPE_P (element ) != IS_STRING ) {
185
- zval_dtor (& tmp );
186
- }
165
+ STR_RELEASE (str );
187
166
} ZEND_HASH_FOREACH_END ();
188
167
189
168
assert ((uint )(p - env .envp ) <= sizeenv );
0 commit comments