Attached is a suggested fix for bug #22592, which has finally come out of a successful long-hour-introspection with zend_execute.c.
Although the patch actually does somewhat hackish things and should appear to be invalid, I believe it's the right one. Moriyoshi
Index: Zend/zend_execute.c =================================================================== RCS file: /repository/ZendEngine2/zend_execute.c,v retrieving revision 1.445 diff -u -r1.445 zend_execute.c --- Zend/zend_execute.c 11 Mar 2003 23:19:45 -0000 1.445 +++ Zend/zend_execute.c 15 Mar 2003 23:28:51 -0000 @@ -441,7 +441,7 @@ break; } if (T->EA.data.str_offset.offset >= T->EA.data.str_offset.str->value.str.len) { - zend_uint i; + int i; if (T->EA.data.str_offset.str->value.str.len==0) { STR_FREE(T->EA.data.str_offset.str->value.str.val); @@ -467,37 +467,25 @@ T->EA.data.str_offset.str->value.str.val[T->EA.data.str_offset.offset] = final_value->value.str.val[0]; - if (op2) { - if (op2->op_type == IS_VAR) { - if (value == &T(op2->u.var).tmp_var) { - STR_FREE(value->value.str.val); - } - } else { - if (final_value == &T(op2->u.var).tmp_var) { - /* we can safely free final_value here - * because separation is done only - * in case op2->op_type == IS_VAR */ - STR_FREE(final_value->value.str.val); - } - } - } if (final_value == &tmp) { zval_dtor(final_value); } - /* - * the value of an assignment to a string offset is undefined - T(result->u.var).var = &T->EA.data.str_offset.str; - */ } while (0); - /* zval_ptr_dtor(&T->EA.data.str_offset.str); Nuke this line if it doesn't cause a leak */ - T->tmp_var.type = IS_STRING; } break; EMPTY_SWITCH_DEFAULT_CASE() } - T(result->u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr); - SELECTIVE_PZVAL_LOCK(*T(result->u.var).var.ptr_ptr, result); + + if (type == IS_TMP_VAR) { + memcpy(T(result->u.var).var.tmp_str, value->value.str.val, 2); + STR_FREE(value->value.str.val); + value->value.str.val = T(result->u.var).var.tmp_str; + value->value.str.len = 1; + } + T(result->u.var).var.ptr_ptr = &value; + SELECTIVE_PZVAL_LOCK(value, result); AI_USE_PTR(T(result->u.var).var); + return; } Index: Zend/zend_execute.h =================================================================== RCS file: /repository/ZendEngine2/zend_execute.h,v retrieving revision 1.52 diff -u -r1.52 zend_execute.h --- Zend/zend_execute.h 16 Feb 2003 11:12:42 -0000 1.52 +++ Zend/zend_execute.h 15 Mar 2003 23:28:51 -0000 @@ -32,6 +32,7 @@ struct { zval **ptr_ptr; zval *ptr; + char tmp_str[4]; } var; struct { zval tmp_var; /* a dummy */ @@ -39,7 +40,7 @@ union { struct { zval *str; - zend_uint offset; + int offset; } str_offset; zend_property_reference overloaded_element; } data;
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php