From d4af6ba6bf3fb3d2fd53bb725cd2d6dd06ab581c Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 1 Aug 2007 11:44:25 +0000 Subject: [PATCH] Fixed namespace name and internal class name ambiguity --- Zend/tests/ns_038.phpt | 15 +++++++ Zend/zend_vm_def.h | 9 +++++ Zend/zend_vm_execute.h | 90 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+) create mode 100755 Zend/tests/ns_038.phpt diff --git a/Zend/tests/ns_038.phpt b/Zend/tests/ns_038.phpt new file mode 100755 index 00000000000..fcaa3c44544 --- /dev/null +++ b/Zend/tests/ns_038.phpt @@ -0,0 +1,15 @@ +--TEST-- +038: Name ambiguity (namespace name or internal class name) +--FILE-- +extended_value & ZEND_FETCH_CLASS_RT_NS_CHECK) { + lcname_len -= Z_UNILEN(opline->op2.u.constant) + 2; + if (UG(unicode)) { + ns.u[lcname_len] = 0; + } else { + ns.s[lcname_len] = 0; + } ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ns, lcname_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC); + if (!ce) { + zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant)); + } } else { zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant)); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 5cba69dc2b0..2fa433fcaac 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -2601,7 +2601,16 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HAN } } if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_CHECK) { + lcname_len -= Z_UNILEN(opline->op2.u.constant) + 2; + if (UG(unicode)) { + ns.u[lcname_len] = 0; + } else { + ns.s[lcname_len] = 0; + } ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ns, lcname_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC); + if (!ce) { + zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant)); + } } else { zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant)); } @@ -3097,7 +3106,16 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDL } } if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_CHECK) { + lcname_len -= Z_UNILEN(opline->op2.u.constant) + 2; + if (UG(unicode)) { + ns.u[lcname_len] = 0; + } else { + ns.s[lcname_len] = 0; + } ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ns, lcname_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC); + if (!ce) { + zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant)); + } } else { zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant)); } @@ -3594,7 +3612,16 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDL } } if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_CHECK) { + lcname_len -= Z_UNILEN(opline->op2.u.constant) + 2; + if (UG(unicode)) { + ns.u[lcname_len] = 0; + } else { + ns.s[lcname_len] = 0; + } ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ns, lcname_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC); + if (!ce) { + zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant)); + } } else { zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant)); } @@ -3857,7 +3884,16 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HA } } if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_CHECK) { + lcname_len -= Z_UNILEN(opline->op2.u.constant) + 2; + if (UG(unicode)) { + ns.u[lcname_len] = 0; + } else { + ns.s[lcname_len] = 0; + } ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ns, lcname_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC); + if (!ce) { + zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant)); + } } else { zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant)); } @@ -4322,7 +4358,16 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLE } } if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_CHECK) { + lcname_len -= Z_UNILEN(opline->op2.u.constant) + 2; + if (UG(unicode)) { + ns.u[lcname_len] = 0; + } else { + ns.s[lcname_len] = 0; + } ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ns, lcname_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC); + if (!ce) { + zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant)); + } } else { zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant)); } @@ -10219,7 +10264,16 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDL } } if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_CHECK) { + lcname_len -= Z_UNILEN(opline->op2.u.constant) + 2; + if (UG(unicode)) { + ns.u[lcname_len] = 0; + } else { + ns.s[lcname_len] = 0; + } ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ns, lcname_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC); + if (!ce) { + zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant)); + } } else { zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant)); } @@ -11947,7 +12001,16 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER } } if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_CHECK) { + lcname_len -= Z_UNILEN(opline->op2.u.constant) + 2; + if (UG(unicode)) { + ns.u[lcname_len] = 0; + } else { + ns.s[lcname_len] = 0; + } ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ns, lcname_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC); + if (!ce) { + zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant)); + } } else { zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant)); } @@ -13667,7 +13730,16 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER } } if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_CHECK) { + lcname_len -= Z_UNILEN(opline->op2.u.constant) + 2; + if (UG(unicode)) { + ns.u[lcname_len] = 0; + } else { + ns.s[lcname_len] = 0; + } ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ns, lcname_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC); + if (!ce) { + zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant)); + } } else { zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant)); } @@ -14585,7 +14657,16 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HAND } } if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_CHECK) { + lcname_len -= Z_UNILEN(opline->op2.u.constant) + 2; + if (UG(unicode)) { + ns.u[lcname_len] = 0; + } else { + ns.s[lcname_len] = 0; + } ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ns, lcname_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC); + if (!ce) { + zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant)); + } } else { zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant)); } @@ -15955,7 +16036,16 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ } } if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_CHECK) { + lcname_len -= Z_UNILEN(opline->op2.u.constant) + 2; + if (UG(unicode)) { + ns.u[lcname_len] = 0; + } else { + ns.s[lcname_len] = 0; + } ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ns, lcname_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC); + if (!ce) { + zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant)); + } } else { zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant)); }