Skip to content

Commit

Permalink
Merge branch 'PHP-8.4'
Browse files Browse the repository at this point in the history
* PHP-8.4:
  Fix GH-17246: GC during SCCP causes segfault
  • Loading branch information
nielsdos committed Dec 24, 2024
2 parents bf3673a + e45fdd2 commit db54a83
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 0 deletions.
3 changes: 3 additions & 0 deletions ext/opcache/ZendAccelerator.c
Original file line number Diff line number Diff line change
Expand Up @@ -2165,7 +2165,10 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type)
*/
from_shared_memory = false;
if (persistent_script) {
/* See GH-17246: we disable GC so that user code cannot be executed during the optimizer run. */
bool orig_gc_state = gc_enable(false);
persistent_script = cache_script_in_shared_memory(persistent_script, key, &from_shared_memory);
gc_enable(orig_gc_state);
}

/* Caching is disabled, returning op_array;
Expand Down
8 changes: 8 additions & 0 deletions ext/opcache/tests/jit/gh17246.inc
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

// Need to cause a trace exit, so extend non existent class
class MyXSLTProcessor extends NonExistentClass {
public function registerCycle() {
[[$this]]; // Non trivial array
}
}
39 changes: 39 additions & 0 deletions ext/opcache/tests/jit/gh17246.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
--TEST--
GH-17246 (Nested shm protections cause segfault)
--EXTENSIONS--
opcache
--INI--
opcache.protect_memory=1
opcache.jit_buffer_size=32M
opcache.jit=1254
--FILE--
<?php

class Test
{
private $field;

public function __construct()
{
$this->field = function() {};
}

public function __destruct()
{
// Necessary because we need to invoke tracing JIT during destruction
}
}

for ($i = 0; $i < 10000; ++$i) {
$obj = new Test();
}

require __DIR__.'/gh17246.inc';

?>
--EXPECTF--
Fatal error: Uncaught Error: Class "NonExistentClass" not found in %s:%d
Stack trace:
#0 %s(%d): require()
#1 {main}
thrown in %s on line %d

0 comments on commit db54a83

Please sign in to comment.