iliaa Tue Jan 6 15:07:08 2004 EDT Added files: /php-src/ext/standard/tests/strings bug26817.phpt bug26819.phpt
Modified files: /php-src NEWS /php-src/ext/standard http.c php_http.h Log: Fixed bug #26819 (http_build_query() crashes on NULL output). Fixed bug #26817 (http_build_query() does not handle private & protected object properties correctly). Index: php-src/NEWS diff -u php-src/NEWS:1.1568 php-src/NEWS:1.1569 --- php-src/NEWS:1.1568 Mon Jan 5 09:31:48 2004 +++ php-src/NEWS Tue Jan 6 15:07:05 2004 @@ -5,6 +5,9 @@ (Derick) - Fixed problems with longlong values in mysqli. (Georg) - Fixed class name case preserving of user defined classes. (Marcus) +- Fixed bug #26819 (http_build_query() crashes on NULL output). (Ilia) +- Fixed bug #26817 (http_build_query() does not handle private & protected + object properties correctly). (Ilia) - Fixed bug #26762 (unserialize() produces lowercase classnames). (Marcus) - Fixed bug #26743 (getElementsByTagName doesn't work properly). (Rob) - Fixed bug #26736 (__autoload not invoked for parent classes). (Marcus) Index: php-src/ext/standard/http.c diff -u php-src/ext/standard/http.c:1.8 php-src/ext/standard/http.c:1.9 --- php-src/ext/standard/http.c:1.8 Sat Sep 6 20:00:00 2003 +++ php-src/ext/standard/http.c Tue Jan 6 15:07:06 2004 @@ -1,4 +1,4 @@ -/* +/* +----------------------------------------------------------------------+ | PHP Version 4 | +----------------------------------------------------------------------+ @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: http.c,v 1.8 2003/09/07 00:00:00 sniper Exp $ */ +/* $Id: http.c,v 1.9 2004/01/06 20:07:06 iliaa Exp $ */ #include "php_http.h" #include "php_ini.h" @@ -28,7 +28,8 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr, const char *num_prefix, int num_prefix_len, const char *key_prefix, int key_prefix_len, - const char *key_suffix, int key_suffix_len TSRMLS_DC) + const char *key_suffix, int key_suffix_len, + zval *type TSRMLS_DC) { char *arg_sep = NULL, *key = NULL, *ekey, *newprefix, *p; int arg_sep_len, key_len, ekey_len, key_type, newprefix_len; @@ -58,6 +59,18 @@ /* We don't want that trailing NULL */ key_len -= 1; } + + /* handling for private & protected object properties */ + if (*key == '\0' && type != NULL) { + zend_object *zobj = zend_objects_get_address(type TSRMLS_CC); + if (zend_check_property_access(zobj, key TSRMLS_CC) != SUCCESS) { + /* private or protected property access outside of the class */ + continue; + } + char *tmp; + zend_unmangle_property_name(key, &tmp, &key); + key_len = strlen(key); + } if (zend_hash_get_current_data_ex(ht, (void **)&zdata, NULL) == FAILURE || !zdata || !(*zdata)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error traversing form data array."); @@ -113,7 +126,7 @@ *p = '\0'; } ht->nApplyCount++; - php_url_encode_hash_ex(HASH_OF(*zdata), formstr, NULL, 0, newprefix, newprefix_len, "]", 1 TSRMLS_CC); + php_url_encode_hash_ex(HASH_OF(*zdata), formstr, NULL, 0, newprefix, newprefix_len, "]", 1, (Z_TYPE_PP(zdata) == IS_OBJECT ? *zdata : NULL) TSRMLS_CC); ht->nApplyCount--; efree(newprefix); } else if (Z_TYPE_PP(zdata) == IS_NULL || Z_TYPE_PP(zdata) == IS_RESOURCE) { @@ -134,7 +147,7 @@ if (num_prefix) { smart_str_appendl(formstr, num_prefix, num_prefix_len); } - ekey_len = spprintf(&ekey, 12, "%ld", idx); + ekey_len = spprintf(&ekey, 12, "%ld", idx); smart_str_appendl(formstr, ekey, ekey_len); efree(ekey); } @@ -163,7 +176,7 @@ smart_str_appendl(formstr, ekey, ekey_len); efree(ekey); } - } + } return SUCCESS; } @@ -187,17 +200,23 @@ RETURN_FALSE; } - if (php_url_encode_hash_ex(HASH_OF(formdata), &formstr, prefix, prefix_len, NULL, 0, NULL, 0 TSRMLS_CC) == FAILURE) { + if (php_url_encode_hash_ex(HASH_OF(formdata), &formstr, prefix, prefix_len, NULL, 0, NULL, 0, (Z_TYPE_P(formdata) == IS_OBJECT ? formdata : NULL) TSRMLS_CC) == FAILURE) { if (formstr.c) { efree(formstr.c); } RETURN_FALSE; } + + if (!formstr.c) { + RETURN_NULL(); + } + smart_str_0(&formstr); + RETURN_STRINGL(formstr.c, formstr.len, 0); } /* }}} */ - + /* * Local variables: * tab-width: 4 Index: php-src/ext/standard/php_http.h diff -u php-src/ext/standard/php_http.h:1.1 php-src/ext/standard/php_http.h:1.2 --- php-src/ext/standard/php_http.h:1.1 Sat Sep 6 08:56:02 2003 +++ php-src/ext/standard/php_http.h Tue Jan 6 15:07:06 2004 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_http.h,v 1.1 2003/09/06 12:56:02 sniper Exp $ */ +/* $Id: php_http.h,v 1.2 2004/01/06 20:07:06 iliaa Exp $ */ #ifndef PHP_HTTP_H #define PHP_HTTP_H @@ -27,7 +27,8 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr, const char *num_prefix, int num_prefix_len, const char *key_prefix, int key_prefix_len, - const char *key_suffix, int key_suffix_len TSRMLS_DC); + const char *key_suffix, int key_suffix_len, + zval *type TSRMLS_DC); #define php_url_encode_hash(ht, formstr) php_url_encode_hash_ex((ht), (formstr), NULL, 0, NULL, 0, NULL, 0 TSRMLS_CC) PHP_FUNCTION(http_build_query); Index: php-src/ext/standard/tests/strings/bug26817.phpt +++ php-src/ext/standard/tests/strings/bug26817.phpt --TEST-- Bug #26817 (http_build_query() did not handle private & protected object properties) --FILE-- <?php class test { protected $foo; private $bar; public $test; function foo() { $this->bar = 'meuh'; $this->foo = 'lala'; $this->test = 'test'; var_dump(http_build_query($this)); } } $obj = new test(); $obj->foo(); var_dump(http_build_query($obj)); ?> --EXPECT-- string(27) "foo=lala&bar=meuh&test=test" string(9) "test=test" Index: php-src/ext/standard/tests/strings/bug26819.phpt +++ php-src/ext/standard/tests/strings/bug26819.phpt --TEST-- Bug #26819 (http_build_query() crash on empty output) --FILE-- <?php $a = array(); var_dump(http_build_query($a)); ?> --EXPECT-- NULL -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php