On Thu, 2004-02-26 at 05:50, Timm Friebe wrote:
> On Thu, 2004-02-26 at 01:33, Timm Friebe wrote:
> > On Wed, 2004-02-25 at 15:41, Andi Gutmans wrote:
> > > Quick reminder...
> > > If you have any bugs to fix, please fix them in the coming days.
>
> ...and another one:
And yet another one (includes, as before, all of the following) and
fixes the following (by adding a convert_to_string_ex() at the
appropriate place):
$ cat reflection_segfault.php
<?php
$r= new Reflection_Class(NULL);
?>
$ php-dev reflection_segfault.php
Segmentation fault (core dumped)
- Timm
Index: Zend/zend_reflection_api.c
===================================================================
RCS file: /repository/ZendEngine2/zend_reflection_api.c,v
retrieving revision 1.88
diff -u -r1.88 zend_reflection_api.c
--- Zend/zend_reflection_api.c 25 Feb 2004 08:58:56 -0000 1.88
+++ Zend/zend_reflection_api.c 26 Feb 2004 05:29:53 -0000
@@ -771,7 +771,10 @@
zend_class_entry *tmp_ce = ce->parent;
zend_property_info *tmp_info;
- while (tmp_ce && zend_hash_find(&ce->properties_info, prop_name, strlen(prop_name) + 1, (void **) &tmp_info) == SUCCESS) {
+ while (tmp_ce && zend_hash_find(&tmp_ce->properties_info, prop_name, strlen(prop_name) + 1, (void **) &tmp_info) == SUCCESS) {
+ if (tmp_info->flags != prop->flags) { /* private in super class, public in child => NOT the same property */
+ break;
+ }
ce = tmp_ce;
prop = tmp_info;
tmp_ce = tmp_ce->parent;
@@ -1796,6 +1799,7 @@
zval_add_ref(&argument);
}
} else {
+ convert_to_string_ex(&argument);
if (zend_lookup_class(Z_STRVAL_P(argument), Z_STRLEN_P(argument), &ce TSRMLS_CC) == FAILURE) {
zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC,
"Class %s does not exist", Z_STRVAL_P(argument));
@@ -2298,6 +2302,14 @@
zend_fcall_info fci;
zend_fcall_info_cache fcc;
+ if (!(ce->constructor->common.fn_flags & ZEND_ACC_PUBLIC)) {
+ zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC,
+ "Acess to non-public constructor of class %s",
+ ce->name
+ );
+ return;
+ }
+
params = safe_emalloc(sizeof(zval **), argc, 0);
if (zend_get_parameters_array_ex(argc, params) == FAILURE) {
efree(params);
@@ -2564,19 +2576,22 @@
"Property %s::$%s does not exist", ce->name, name_str);
return;
}
- free_alloca(lcname);
-
+
if (!(property_info->flags & ZEND_ACC_PRIVATE)) {
/* we have to seach the class hierarchy for this (implicit) public or protected property */
zend_class_entry *tmp_ce = ce->parent;
zend_property_info *tmp_info;
- while (tmp_ce && zend_hash_find(&ce->properties_info, name_str, name_len + 1, (void **) &tmp_info) == SUCCESS) {
+ while (tmp_ce && zend_hash_find(&tmp_ce->properties_info, lcname, name_len + 1, (void **) &tmp_info) == SUCCESS) {
+ if (tmp_info->flags != property_info->flags) { /* private in super class, public in child => NOT the same property */
+ break;
+ }
ce = tmp_ce;
property_info = tmp_info;
tmp_ce = tmp_ce->parent;
}
}
+ free_alloca(lcname);
MAKE_STD_ZVAL(classname);
ZVAL_STRINGL(classname, ce->name, ce->name_length, 1);
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php