@@ -77,13 +77,13 @@ static php_process_env_t _php_array_to_envp(zval *environment, int is_persistent
77
77
{
78
78
zval * element ;
79
79
php_process_env_t env ;
80
- zend_string * string_key ;
80
+ zend_string * key , * str ;
81
81
#ifndef PHP_WIN32
82
82
char * * ep ;
83
83
#endif
84
84
char * p ;
85
- size_t cnt , l , sizeenv = 0 ;
86
- HashTable * target_hash ;
85
+ size_t cnt , l , sizeenv = 0 ;
86
+ HashTable * env_hash ;
87
87
88
88
memset (& env , 0 , sizeof (env ));
89
89
@@ -101,28 +101,25 @@ static php_process_env_t _php_array_to_envp(zval *environment, int is_persistent
101
101
return env ;
102
102
}
103
103
104
- target_hash = Z_ARRVAL_P (environment );
105
- if (!target_hash ) {
106
- return env ;
107
- }
104
+ ALLOC_HASHTABLE (env_hash );
105
+ zend_hash_init (env_hash , cnt , NULL , NULL , 0 );
108
106
109
107
/* first, we have to get the size of all the elements in the hash */
110
- ZEND_HASH_FOREACH_STR_KEY_VAL (target_hash , string_key , element ) {
111
- zend_string * str = zval_get_string (element );
112
- size_t el_len = ZSTR_LEN (str );
113
- zend_string_release (str );
108
+ ZEND_HASH_FOREACH_STR_KEY_VAL (Z_ARRVAL_P (environment ), key , element ) {
109
+ str = zval_get_string (element );
114
110
115
- if (el_len == 0 ) {
111
+ if (ZSTR_LEN (str ) == 0 ) {
112
+ zend_string_release (str );
116
113
continue ;
117
114
}
118
115
119
- sizeenv += el_len + 1 ;
116
+ sizeenv += ZSTR_LEN ( str ) + 1 ;
120
117
121
- if (string_key ) {
122
- if ( ZSTR_LEN (string_key ) == 0 ) {
123
- continue ;
124
- }
125
- sizeenv += ZSTR_LEN ( string_key ) + 1 ;
118
+ if (key && ZSTR_LEN ( key ) ) {
119
+ sizeenv += ZSTR_LEN (key ) + 1 ;
120
+ zend_hash_add_ptr ( env_hash , key , str ) ;
121
+ } else {
122
+ zend_hash_next_index_insert_ptr ( env_hash , str ) ;
126
123
}
127
124
} ZEND_HASH_FOREACH_END ();
128
125
@@ -131,20 +128,10 @@ static php_process_env_t _php_array_to_envp(zval *environment, int is_persistent
131
128
#endif
132
129
p = env .envp = (char * ) pecalloc (sizeenv + 4 , 1 , is_persistent );
133
130
134
- ZEND_HASH_FOREACH_STR_KEY_VAL (target_hash , string_key , element ) {
135
- zend_string * str = zval_get_string (element );
136
-
137
- if (ZSTR_LEN (str ) == 0 ) {
138
- goto next_element ;
139
- }
140
-
141
- if (string_key ) {
142
- if (ZSTR_LEN (string_key ) == 0 ) {
143
- goto next_element ;
144
- }
145
-
146
- l = ZSTR_LEN (string_key ) + ZSTR_LEN (str ) + 2 ;
147
- memcpy (p , ZSTR_VAL (string_key ), ZSTR_LEN (string_key ));
131
+ ZEND_HASH_FOREACH_STR_KEY_PTR (env_hash , key , str ) {
132
+ if (key ) {
133
+ l = ZSTR_LEN (key ) + ZSTR_LEN (str ) + 2 ;
134
+ memcpy (p , ZSTR_VAL (key ), ZSTR_LEN (key ));
148
135
strncat (p , "=" , 1 );
149
136
strncat (p , ZSTR_VAL (str ), ZSTR_LEN (str ));
150
137
@@ -161,12 +148,14 @@ static php_process_env_t _php_array_to_envp(zval *environment, int is_persistent
161
148
#endif
162
149
p += ZSTR_LEN (str ) + 1 ;
163
150
}
164
- next_element :
165
151
zend_string_release (str );
166
152
} ZEND_HASH_FOREACH_END ();
167
153
168
154
assert ((uint )(p - env .envp ) <= sizeenv );
169
155
156
+ zend_hash_destroy (env_hash );
157
+ FREE_HASHTABLE (env_hash );
158
+
170
159
return env ;
171
160
}
172
161
/* }}} */
0 commit comments