Merge branch 'master' into phpng
[m6w6/ext-http] / php_http_params.c
index 1be8e55ecd1b5baa34e70a252cb97f60d63454e5..6e5dd4a0df442602ca6cd52e882d2a9231fc7086 100644 (file)
@@ -60,14 +60,14 @@ static inline void sanitize_escaped(zval *zv)
                ZVAL_STR(zv, php_http_cs2zs(deq, deq_len));
        }
 
-       php_stripcslashes(Z_STRVAL_P(zv), &Z_STRLEN_P(zv));
+       php_stripcslashes(Z_STR_P(zv));
 }
 
 static inline void prepare_escaped(zval *zv)
 {
        if (Z_TYPE_P(zv) == IS_STRING) {
                size_t len = Z_STRLEN_P(zv);
-               zend_string *stripped = php_addcslashes(Z_STRVAL_P(zv), Z_STRLEN_P(zv), 0,
+               zend_string *stripped = php_addcslashes(Z_STR_P(zv), 0,
                                ZEND_STRL("\0..\37\173\\\""));
 
                if (len != stripped->len || strpbrk(stripped->val, "()<>@,;:\"[]?={} ")) {
@@ -176,7 +176,7 @@ static void prepare_dimension(php_http_buffer_t *buf, php_http_buffer_t *keybuf,
                php_http_buffer_init(&prefix);
                php_http_buffer_append(&prefix, keybuf->data, keybuf->used);
 
-               ZEND_HASH_FOREACH_KEY_VAL(ht, key.h, key.key, val)
+               ZEND_HASH_FOREACH_KEY_VAL_IND(ht, key.h, key.key, val)
                {
                        if (key.key && !*key.key->val) {
                                /* only public properties */
@@ -445,9 +445,12 @@ static void merge_param(HashTable *params, zval *zdata, zval **current_param, zv
                                if (Z_TYPE_P(test_ptr) == IS_ARRAY) {
                                        /* now find key in ptr */
                                        if (HASH_KEY_IS_STRING == zend_hash_get_current_key(Z_ARRVAL_P(zdata_ptr), &hkey.key, &hkey.h)) {
+                                               zval *tmp_ptr = ptr;
+
                                                if ((ptr = zend_hash_find(Z_ARRVAL_P(ptr), hkey.key))) {
                                                        zdata_ptr = test_ptr;
                                                } else {
+                                                       ptr = tmp_ptr;
                                                        Z_TRY_ADDREF_P(test_ptr);
                                                        ptr = zend_hash_update(Z_ARRVAL_P(ptr), hkey.key, test_ptr);
                                                        break;
@@ -721,6 +724,9 @@ static inline void shift_rfc5987(php_http_buffer_t *buf, zval *zvalue, const cha
                                (int) (key.key->len > INT_MAX ? INT_MAX : key.key->len), key.key->val);
                php_http_arrkey_dtor(&key);
 
+               if (Z_TYPE_P(zdata) == IS_INDIRECT) {
+                       zdata = Z_INDIRECT_P(zdata);
+               }
                zs = zval_get_string(zdata);
                ZVAL_STR(&tmp, zs);
                prepare_value(flags | PHP_HTTP_PARAMS_URLENCODED, &tmp);
@@ -767,7 +773,7 @@ static void shift_arg(php_http_buffer_t *buf, char *key_str, size_t key_len, zva
                if (!rfc5987) {
                        shift_key(buf, key_str, key_len, ass, asl, flags);
                }
-               ZEND_HASH_FOREACH_KEY_VAL(ht, key.h, key.key, val)
+               ZEND_HASH_FOREACH_KEY_VAL_IND(ht, key.h, key.key, val)
                {
                        /* did you mean recursion? */
                        php_http_arrkey_stringify(&key, NULL);
@@ -965,9 +971,9 @@ PHP_METHOD(HttpParams, __construct)
 
                                                php_http_params_opts_t opts = {
                                                        {zs->val, zs->len},
-                                                       php_http_params_separator_init(zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("param_sep"), 0)),
-                                                       php_http_params_separator_init(zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("arg_sep"), 0)),
-                                                       php_http_params_separator_init(zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("val_sep"), 0)),
+                                                       php_http_params_separator_init(zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("param_sep"), 0, &tmp)),
+                                                       php_http_params_separator_init(zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("arg_sep"), 0, &tmp)),
+                                                       php_http_params_separator_init(zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("val_sep"), 0, &tmp)),
                                                        {{0}}, flags
                                                };
 
@@ -998,12 +1004,12 @@ ZEND_BEGIN_ARG_INFO_EX(ai_HttpParams_toArray, 0, 0, 0)
 ZEND_END_ARG_INFO();
 PHP_METHOD(HttpParams, toArray)
 {
-       zval *zparams;
+       zval zparams_tmp, *zparams;
 
        if (SUCCESS != zend_parse_parameters_none()) {
                return;
        }
-       zparams = zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("params"), 0);
+       zparams = zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("params"), 0, &zparams_tmp);
        RETURN_ZVAL_FAST(zparams);
 }
 
@@ -1012,27 +1018,28 @@ ZEND_END_ARG_INFO();
 PHP_METHOD(HttpParams, toString)
 {
        zval *tmp, *zparams, *zpsep, *zasep, *zvsep;
+       zval zparams_tmp, flags_tmp, psep_tmp, asep_tmp, vsep_tmp;
        zend_string *psep, *asep, *vsep;
        long flags;
        php_http_buffer_t buf;
 
-       zparams = zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("params"), 0);
+       zparams = zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("params"), 0, &zparams_tmp);
        convert_to_array_ex(zparams);
-       flags = zval_get_long(zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("flags"), 0));
+       flags = zval_get_long(zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("flags"), 0, &flags_tmp));
 
-       zpsep = zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("param_sep"), 0);
+       zpsep = zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("param_sep"), 0, &psep_tmp);
        if (Z_TYPE_P(zpsep) == IS_ARRAY && (tmp = zend_hash_get_current_data(Z_ARRVAL_P(zpsep)))) {
                psep = zval_get_string(tmp);
        } else {
                psep = zval_get_string(zpsep);
        }
-       zasep = zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("arg_sep"), 0);
+       zasep = zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("arg_sep"), 0, &asep_tmp);
        if (Z_TYPE_P(zasep) == IS_ARRAY && (tmp = zend_hash_get_current_data(Z_ARRVAL_P(zasep)))) {
                asep = zval_get_string(tmp);
        } else {
                asep = zval_get_string(zasep);
        }
-       zvsep = zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("val_sep"), 0);
+       zvsep = zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("val_sep"), 0, &vsep_tmp);
        if (Z_TYPE_P(zvsep) == IS_ARRAY && (tmp = zend_hash_get_current_data(Z_ARRVAL_P(zvsep)))) {
                vsep = zval_get_string(tmp);
        } else {
@@ -1055,13 +1062,13 @@ ZEND_END_ARG_INFO();
 PHP_METHOD(HttpParams, offsetExists)
 {
        zend_string *name;
-       zval *zparam, *zparams;
+       zval zparams_tmp, *zparam, *zparams;
 
        if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "S", &name)) {
                return;
        }
 
-       zparams = zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("params"), 0);
+       zparams = zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("params"), 0, &zparams_tmp);
 
        if (Z_TYPE_P(zparams) == IS_ARRAY && (zparam = zend_symtable_find(Z_ARRVAL_P(zparams), name))) {
                RETVAL_BOOL(Z_TYPE_P(zparam) != IS_NULL);
@@ -1076,13 +1083,13 @@ ZEND_END_ARG_INFO();
 PHP_METHOD(HttpParams, offsetGet)
 {
        zend_string *name;
-       zval *zparam, *zparams;
+       zval zparams_tmp, *zparam, *zparams;
 
        if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "S", &name)) {
                return;
        }
 
-       zparams = zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("params"), 0);
+       zparams = zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("params"), 0, &zparams_tmp);
 
        if (Z_TYPE_P(zparams) == IS_ARRAY && (zparam = zend_symtable_find(Z_ARRVAL_P(zparams), name))) {
                RETVAL_ZVAL_FAST(zparam);
@@ -1095,13 +1102,13 @@ ZEND_END_ARG_INFO();
 PHP_METHOD(HttpParams, offsetUnset)
 {
        zend_string *name;
-       zval *zparams;
+       zval zparams_tmp, *zparams;
 
        if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "S", &name)) {
                return;
        }
 
-       zparams = zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("params"), 0);
+       zparams = zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("params"), 0, &zparams_tmp);
 
        if (Z_TYPE_P(zparams) == IS_ARRAY) {
                zend_symtable_del(Z_ARRVAL_P(zparams), name);
@@ -1115,13 +1122,13 @@ ZEND_END_ARG_INFO();
 PHP_METHOD(HttpParams, offsetSet)
 {
        zend_string *name;
-       zval *zparam, *zparams, *nvalue;
+       zval zparams_tmp, *zparam, *zparams, *nvalue;
 
        if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Sz", &name, &nvalue)) {
                return;
        }
 
-       zparams = zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("params"), 0);
+       zparams = zend_read_property(php_http_params_class_entry, getThis(), ZEND_STRL("params"), 0, &zparams_tmp);
        convert_to_array(zparams);
 
        if (name->len) {