]> granicus.if.org Git - php/commitdiff
Code cleanup in proc_open
authorNikita Popov <nikic@php.net>
Fri, 9 May 2014 11:01:38 +0000 (13:01 +0200)
committerNikita Popov <nikic@php.net>
Fri, 9 May 2014 11:01:38 +0000 (13:01 +0200)
ext/standard/proc_open.c

index 35ea3d1b743b90dccbedfcbac05b614a7353cf5b..39dab2021a8746aaba574395ce35281d7ccd6e8b 100644 (file)
@@ -78,13 +78,11 @@ static php_process_env_t _php_array_to_envp(zval *environment, int is_persistent
        zval *element;
        php_process_env_t env;
        zend_string *string_key;
-       char *data;
 #ifndef PHP_WIN32
        char **ep;
 #endif
        char *p;
-       uint cnt, l, sizeenv=0, el_len;
-       ulong num_key;
+       uint cnt, l, sizeenv=0;
        HashTable *target_hash;
 
        memset(&env, 0, sizeof(env));
@@ -109,22 +107,16 @@ static php_process_env_t _php_array_to_envp(zval *environment, int is_persistent
        }
 
        /* first, we have to get the size of all the elements in the hash */
-       ZEND_HASH_FOREACH_KEY_VAL(target_hash, num_key, string_key, element) {
-               zval tmp;
-
-               if (Z_TYPE_P(element) != IS_STRING) {
-                       ZVAL_DUP(&tmp, element);
-                       convert_to_string(&tmp);
-                       el_len = Z_STRLEN(tmp);
-                       zval_dtor(&tmp);
-               } else {
-                       el_len = Z_STRLEN_P(element);
-               }
+       ZEND_HASH_FOREACH_STR_KEY_VAL(target_hash, string_key, element) {
+               zend_string *str = zval_get_string(element);
+               uint el_len = str->len;
+               STR_RELEASE(str);
+
                if (el_len == 0) {
                        continue;
                }
 
-               sizeenv += el_len+1;
+               sizeenv += el_len + 1;
 
                if (string_key) {
                        if (string_key->len == 0) {
@@ -139,33 +131,22 @@ static php_process_env_t _php_array_to_envp(zval *environment, int is_persistent
 #endif
        p = env.envp = (char *) pecalloc(sizeenv + 4, 1, is_persistent);
 
-       ZEND_HASH_FOREACH_KEY_VAL(target_hash, num_key, string_key, element) {
-               zval tmp;
-
-               if (Z_TYPE_P(element) != IS_STRING) {
-                       ZVAL_DUP(&tmp, element);
-                       convert_to_string(&tmp);
-               } else {
-                       ZVAL_COPY_VALUE(&tmp, element);
-               }
-
-               el_len = Z_STRLEN(tmp);
+       ZEND_HASH_FOREACH_STR_KEY_VAL(target_hash, string_key, element) {
+               zend_string *str = zval_get_string(element);
 
-               if (el_len == 0) {
+               if (str->len == 0) {
                        goto next_element;
                }
 
-               data = Z_STRVAL(tmp);
-
                if (string_key) {
                        if (string_key->len == 0) {
                                goto next_element;
                        }
 
-                       l = string_key->len + el_len + 2;
+                       l = string_key->len + str->len + 2;
                        memcpy(p, string_key->val, string_key->len);
                        strncat(p, "=", 1);
-                       strncat(p, data, el_len);
+                       strncat(p, str->val, str->len);
 
 #ifndef PHP_WIN32
                        *ep = p;
@@ -173,17 +154,15 @@ static php_process_env_t _php_array_to_envp(zval *environment, int is_persistent
 #endif
                        p += l;
                } else {
-                       memcpy(p,data,el_len);
+                       memcpy(p, str->val, str->len);
 #ifndef PHP_WIN32
                        *ep = p;
                        ++ep;
 #endif
-                       p += el_len + 1;
+                       p += str->len + 1;
                }
 next_element:
-               if (Z_TYPE_P(element) != IS_STRING) {
-                       zval_dtor(&tmp);
-               }
+               STR_RELEASE(str);
        } ZEND_HASH_FOREACH_END();
 
        assert((uint)(p - env.envp) <= sizeenv);