summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2016-04-14 20:21:34 +0800
committerXinchen Hui <laruence@gmail.com>2016-04-14 20:21:34 +0800
commit17c3aa9dd1e85a82f8ef81837c2b6ad615e79b23 (patch)
treeb9227619108c09b0f51a4f09c1a75bb028e33242
parent9d76e012cf25c2f6173419fc281c6f756a035371 (diff)
parent8a17b1a2415cc3a44b74bb9bab18d6dded1ee9b0 (diff)
downloadphp-git-17c3aa9dd1e85a82f8ef81837c2b6ad615e79b23.tar.gz
Merge branch 'PHP-7.0'
* PHP-7.0: Fixed bug #72014 (Including a file with anonymous classes multiple times leads to fatal error)
-rw-r--r--ext/opcache/tests/bug72014.phpt29
-rw-r--r--ext/opcache/zend_accelerator_util_funcs.c20
2 files changed, 40 insertions, 9 deletions
diff --git a/ext/opcache/tests/bug72014.phpt b/ext/opcache/tests/bug72014.phpt
new file mode 100644
index 0000000000..d2ad96c0f1
--- /dev/null
+++ b/ext/opcache/tests/bug72014.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Bug #72014 (Including a file with anonymous classes multiple times leads to fatal error)
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.file_update_protection=0
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+file_put_contents(__DIR__ . "/bug72014.annon.php", <<<PHP
+<?php
+\$a = new class() { public \$testvar = "Foo\n"; };
+echo \$a->testvar;
+PHP
+);
+
+include(__DIR__ . "/bug72014.annon.php");
+include(__DIR__ . "/bug72014.annon.php");
+include(__DIR__ . "/bug72014.annon.php");
+?>
+--CLEAN--
+<?php
+@unlink(__DIR__ . "/bug72014.annon.php")
+?>
+--EXPECT--
+Foo
+Foo
+Foo
diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c
index 27731dd624..58794c79df 100644
--- a/ext/opcache/zend_accelerator_util_funcs.c
+++ b/ext/opcache/zend_accelerator_util_funcs.c
@@ -617,7 +617,6 @@ failure:
static void zend_accel_class_hash_copy(HashTable *target, HashTable *source, unique_copy_ctor_func_t pCopyConstructor)
{
- zend_class_entry *ce1;
Bucket *p, *end;
zval *t;
@@ -633,7 +632,17 @@ static void zend_accel_class_hash_copy(HashTable *target, HashTable *source, uni
/* Mangled key - ignore and wait for runtime */
continue;
} else if (UNEXPECTED(!ZCG(accel_directives).ignore_dups)) {
- goto failure;
+ zend_class_entry *ce1 = Z_PTR(p->val);
+ if (!(ce1->ce_flags & ZEND_ACC_ANON_CLASS)) {
+ CG(in_compilation) = 1;
+ zend_set_compiled_filename(ce1->info.user.filename);
+ CG(zend_lineno) = ce1->info.user.line_start;
+ zend_error(E_ERROR,
+ "Cannot declare %s %s, because the name is already in use",
+ zend_get_object_type(ce1), ZSTR_VAL(ce1->name));
+ return;
+ }
+ continue;
}
} else {
t = _zend_hash_append_ptr(target, p->key, Z_PTR(p->val));
@@ -644,13 +653,6 @@ static void zend_accel_class_hash_copy(HashTable *target, HashTable *source, uni
}
target->nInternalPointer = target->nNumOfElements ? 0 : HT_INVALID_IDX;
return;
-
-failure:
- ce1 = Z_PTR(p->val);
- CG(in_compilation) = 1;
- zend_set_compiled_filename(ce1->info.user.filename);
- CG(zend_lineno) = ce1->info.user.line_start;
- zend_error(E_ERROR, "Cannot declare %s %s, because the name is already in use", zend_get_object_type(ce1), ZSTR_VAL(ce1->name));
}
#ifdef __SSE2__