PHP-FPM segfaults with Opcache enabled with Late Static Binding
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- C
- Estrellas
- 40.4k
- Forks
- 8.1k
- Merge medio
- 2 d 13 h
- PR fusionados (30 d)
- 96
Descripción
Description
PHP-FPM crashes then OPCache enabled(Even if I disable all low 16bits of optimization flags in opcache.optimization_level) with some pattern of Late static binding involved.
- Only PHP-FPM is affected. Main PHP binary works fine(With opcache.enable_cli=1)
- PHP-FPM works fine if OPCache is completely disabled(opcache.enable=0)
- PHP-FPM 7.3 with OPCache works fine - 8.0 Crashes.
- Specific case in dev crashes in ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST_HANDLER , but coredumps from our production shown other handlers from Zend/zend_vm_execute.h crashing the same way.
Unfortunately I can't create minimal working test case(I tried my best).
The only thing I know is that pattern like this causes it in the end(Note the constant having initial value via 'self' and later used as LSB via 'static'):
class TestClass
{
const PHOENIX = '/usr/local/bin/grep';
const CON1 = 'propose';
const CON2 = self::CON1;
const CON3 = 'r2';
static public function crash($cmd, $params)
{
$paramsCmd = '';
$fullCmd = static::CON3." '{$cmd}' {$paramsCmd}";
$escalateOptimizer = ' '.static::CON2.' / '.static::CON3;
return 13;
}
}
Segmentation fault info:
Program received signal SIGSEGV, Segmentation fault.
0x0000000000665bc6 in ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST_HANDLER ()
at PHP_BUILD_ROOT/php-8.0.22/Zend/zend_vm_execute.h:32987
32987 if (EXPECTED(CACHED_PTR(opline->extended_value) == ce)) {
(gdb) bt
#0 0x0000000000665bc6 in ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST_HANDLER ()
at PHP_BUILD_ROOT/php-8.0.22/Zend/zend_vm_execute.h:32987
#1 0x00000000006971ac in execute_ex (ex=0x7feb82c141d0)
at PHP_BUILD_ROOT/php-8.0.22/Zend/zend_vm_execute.h:58077
#2 0x000000000069b692 in zend_execute (op_array=0x7feb82c02000, return_value=<optimized out>)
at PHP_BUILD_ROOT/php-8.0.22/Zend/zend_vm_execute.h:59499
#3 0x0000000000635e2b in zend_execute_scripts (type=-2101263920, type@entry=8, retval=retval@entry=0x0,
file_count=file_count@entry=3) at PHP_BUILD_ROOT/php-8.0.22/Zend/zend.c:1694
#4 0x00000000005d53a8 in php_execute_script (primary_file=primary_file@entry=0x7ffeda60fae0)
at PHP_BUILD_ROOT/php-8.0.22/main/main.c:2543
#5 0x00000000004408e3 in main (argc=<optimized out>, argv=<optimized out>)
at PHP_BUILD_ROOT/php-8.0.22/sapi/fpm/fpm/fpm_main.c:1914
(gdb) print ce
$1 = (zend_class_entry *) 0x42d0e058
(gdb) print opline->extended_value
$2 = 0
(gdb) print *opline
$3 = {handler = 0x6971a7 <execute_ex+21591>, op1 = {constant = 515, var = 515, num = 515, opline_num = 515,
jmp_offset = 515}, op2 = {constant = 4294967152, var = 4294967152, num = 4294967152,
opline_num = 4294967152, jmp_offset = 4294967152}, result = {constant = 128, var = 128, num = 128,
opline_num = 128, jmp_offset = 128}, extended_value = 0, lineno = 27, opcode = 181 '\265',
op1_type = 0 '\000', op2_type = 1 '\001', result_type = 2 '\002'}
(gdb)
PHP Version
PHP 8.0.22/8.0.23/8.024
8.1 tree seems to not be affected(Tested on 8.1.11).
Operating System
CentOS 7
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Empieza reproduciendo el ejemplo proporcionado de PHP-FPM con PHP 8.0.22–8.0.24, Opcache habilitado y las constantes de Late Static Binding; después, inspecciona el bloqueo en Zend/zend_vm_execute.h en ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST_HANDLER. Compara PHP-FPM con el binario de CLI y con PHP 8.1. Se considera terminado cuando se haya identificado y corregido el fallo de segmentación relacionado con Opcache mediante una prueba de regresión, aunque el issue no indica ningún archivo de prueba ni proporciona un caso mínimo.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- c, php
- Área
- backend
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Necesita aclaración
- Aptitud para principiantes
- 25/100