diff options
author | Xinchen Hui <laruence@gmail.com> | 2016-01-06 00:03:01 +0800 |
---|---|---|
committer | Xinchen Hui <laruence@gmail.com> | 2016-01-06 00:03:01 +0800 |
commit | 4550e93b78e1e72bfaf6acadbeabe09035c4be58 (patch) | |
tree | 393470412b51d16ac573339fa7f625e5ccac73ee | |
parent | 3d59a752aff9b466a08e5e2c5915ef92ebf98ad3 (diff) | |
parent | ce2b2f7e0a6957703645fa5b6e08507f40ac35a7 (diff) | |
download | php-git-4550e93b78e1e72bfaf6acadbeabe09035c4be58.tar.gz |
Merge branch 'PHP-7.0'
-rw-r--r-- | Zend/tests/bug71275.phpt | 27 | ||||
-rw-r--r-- | Zend/zend_inheritance.c | 22 | ||||
-rw-r--r-- | main/main.c | 19 | ||||
-rw-r--r-- | tests/basic/bug71273.phpt | 21 |
4 files changed, 75 insertions, 14 deletions
diff --git a/Zend/tests/bug71275.phpt b/Zend/tests/bug71275.phpt new file mode 100644 index 0000000000..52443734b7 --- /dev/null +++ b/Zend/tests/bug71275.phpt @@ -0,0 +1,27 @@ +--TEST-- +Bug #71275 (Bad method called on cloning an object having a trait) +--FILE-- +<?php + +trait MyTrait { + public function _() { + throw new RuntimeException('Should not be called'); + } +} + + +class MyClass { + use MyTrait; + + public function __clone() { + echo "I'm working hard to clone"; + } +} + + +$instance = new MyClass(); +clone $instance; + +?> +--EXPECT-- +I'm working hard to clone diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index cf7688e8e4..ce7dd99026 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -1028,34 +1028,34 @@ static zend_bool zend_traits_method_compatibility_check(zend_function *fn, zend_ static void zend_add_magic_methods(zend_class_entry* ce, zend_string* mname, zend_function* fe) /* {{{ */ { - if (!strncmp(ZSTR_VAL(mname), ZEND_CLONE_FUNC_NAME, ZSTR_LEN(mname))) { + if (zend_string_equals_literal(mname, ZEND_CLONE_FUNC_NAME)) { ce->clone = fe; fe->common.fn_flags |= ZEND_ACC_CLONE; - } else if (!strncmp(ZSTR_VAL(mname), ZEND_CONSTRUCTOR_FUNC_NAME, ZSTR_LEN(mname))) { + } else if (zend_string_equals_literal(mname, ZEND_CONSTRUCTOR_FUNC_NAME)) { if (ce->constructor && (!ce->parent || ce->constructor != ce->parent->constructor)) { zend_error_noreturn(E_COMPILE_ERROR, "%s has colliding constructor definitions coming from traits", ZSTR_VAL(ce->name)); } ce->constructor = fe; fe->common.fn_flags |= ZEND_ACC_CTOR; - } else if (!strncmp(ZSTR_VAL(mname), ZEND_DESTRUCTOR_FUNC_NAME, ZSTR_LEN(mname))) { + } else if (zend_string_equals_literal(mname, ZEND_DESTRUCTOR_FUNC_NAME)) { ce->destructor = fe; fe->common.fn_flags |= ZEND_ACC_DTOR; - } else if (!strncmp(ZSTR_VAL(mname), ZEND_GET_FUNC_NAME, ZSTR_LEN(mname))) { + } else if (zend_string_equals_literal(mname, ZEND_GET_FUNC_NAME)) { ce->__get = fe; ce->ce_flags |= ZEND_ACC_USE_GUARDS; - } else if (!strncmp(ZSTR_VAL(mname), ZEND_SET_FUNC_NAME, ZSTR_LEN(mname))) { + } else if (zend_string_equals_literal(mname, ZEND_SET_FUNC_NAME)) { ce->__set = fe; ce->ce_flags |= ZEND_ACC_USE_GUARDS; - } else if (!strncmp(ZSTR_VAL(mname), ZEND_CALL_FUNC_NAME, ZSTR_LEN(mname))) { + } else if (zend_string_equals_literal(mname, ZEND_CALL_FUNC_NAME)) { ce->__call = fe; - } else if (!strncmp(ZSTR_VAL(mname), ZEND_UNSET_FUNC_NAME, ZSTR_LEN(mname))) { + } else if (zend_string_equals_literal(mname, ZEND_UNSET_FUNC_NAME)) { ce->__unset = fe; ce->ce_flags |= ZEND_ACC_USE_GUARDS; - } else if (!strncmp(ZSTR_VAL(mname), ZEND_ISSET_FUNC_NAME, ZSTR_LEN(mname))) { + } else if (zend_string_equals_literal(mname, ZEND_ISSET_FUNC_NAME)) { ce->__isset = fe; ce->ce_flags |= ZEND_ACC_USE_GUARDS; - } else if (!strncmp(ZSTR_VAL(mname), ZEND_CALLSTATIC_FUNC_NAME, ZSTR_LEN(mname))) { + } else if (zend_string_equals_literal(mname, ZEND_CALLSTATIC_FUNC_NAME)) { ce->__callstatic = fe; - } else if (!strncmp(ZSTR_VAL(mname), ZEND_TOSTRING_FUNC_NAME, ZSTR_LEN(mname))) { + } else if (zend_string_equals_literal(mname, ZEND_TOSTRING_FUNC_NAME)) { ce->__tostring = fe; - } else if (!strncmp(ZSTR_VAL(mname), ZEND_DEBUGINFO_FUNC_NAME, ZSTR_LEN(mname))) { + } else if (zend_string_equals_literal(mname, ZEND_DEBUGINFO_FUNC_NAME)) { ce->__debugInfo = fe; } else if (ZSTR_LEN(ce->name) == ZSTR_LEN(mname)) { zend_string *lowercase_name = zend_string_tolower(ce->name); diff --git a/main/main.c b/main/main.c index dfba949351..77a2f64b40 100644 --- a/main/main.c +++ b/main/main.c @@ -723,9 +723,20 @@ PHPAPI ZEND_COLD void php_verror(const char *docref, const char *params, int typ if (PG(html_errors)) { replace_buffer = php_escape_html_entities((unsigned char*)buffer, buffer_len, 0, ENT_COMPAT, NULL); + /* Retry with substituting invalid chars on fail. */ + if (!replace_buffer || ZSTR_LEN(replace_buffer) < 1) { + replace_buffer = php_escape_html_entities((unsigned char*)buffer, buffer_len, 0, ENT_COMPAT | ENT_HTML_SUBSTITUTE_ERRORS, NULL); + } + efree(buffer); - buffer = ZSTR_VAL(replace_buffer); - buffer_len = (int)ZSTR_LEN(replace_buffer); + + if (replace_buffer) { + buffer = ZSTR_VAL(replace_buffer); + buffer_len = (int)ZSTR_LEN(replace_buffer); + } else { + buffer = ""; + buffer_len = 0; + } } /* which function caused the problem if any at all */ @@ -878,7 +889,9 @@ PHPAPI ZEND_COLD void php_verror(const char *docref, const char *params, int typ if (replace_buffer) { zend_string_free(replace_buffer); } else { - efree(buffer); + if (buffer_len > 0) { + efree(buffer); + } } php_error(type, "%s", message); diff --git a/tests/basic/bug71273.phpt b/tests/basic/bug71273.phpt new file mode 100644 index 0000000000..d0cd72577e --- /dev/null +++ b/tests/basic/bug71273.phpt @@ -0,0 +1,21 @@ +--TEST-- +Bug #71273 A wrong ext directory setup in php.ini leads to crash +--SKIPIF-- +<?php + if ("cli" != php_sapi_name()) { + die("skip CLI only"); + } +?> +--FILE-- +<?php + /* NOTE this file is required to be encoded in iso-8859-1 */ + + $cmd = getenv('TEST_PHP_EXECUTABLE') . " -n -d html_errors=on -d extension_dir=a/é/w -d extension=php_kartoffelbrei.dll -v 2>&1"; + $out = shell_exec($cmd); + + var_dump(preg_match(",.+a[\\/].+[\\/]w.php_kartoffelbrei.dll.+,s", $out)); +?> +==DONE== +--EXPECTF-- +int(1) +==DONE== |