Browse Source

Fixed bug #72014 (Including a file with anonymous classes multiple times leads to fatal error)

pull/1872/head
Xinchen Hui 10 years ago
parent
commit
8a17b1a241
  1. 4
      NEWS
  2. 29
      ext/opcache/tests/bug72014.phpt
  3. 20
      ext/opcache/zend_accelerator_util_funcs.c

4
NEWS

@ -6,6 +6,10 @@ PHP NEWS
. Fixed bug #71600 (oci_fetch_all segfaults when selecting more than
eight columns)
- Opcache:
. Fixed bug #72014 (Including a file with anonymous classes multiple times
leads to fatal error). (Laruence)
- SQLite3:
. Fixed bug #68849 (bindValue is not using the right data type).
(Anatol)

29
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

20
ext/opcache/zend_accelerator_util_funcs.c

@ -610,7 +610,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;
@ -626,7 +625,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));
@ -637,13 +646,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__

Loading…
Cancel
Save