php / php/php-src

preloading shutdown frees objects before module shutdown

Abierto
#9,957 2 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Bug Extension: opcache Status: Needs Triage
Lenguaje dominante
C
Estrellas
40.4k
Forks
8.2k
Merge medio
2 d 13 h
PR fusionados (30 d)
96

Descripción

Description

Since cecea72a10aa6470b3426a8d2f905f5ef2fe29b3, preloading executes zend_shutdown_executor_values() early in accel_preload() directly, causing zend_objects_store_free_object_storage() to be called long before php_request_shutdown() is called, which calls php_module_shutdown() - before zend_shutdown_executor_values, normally.

Can we bring consistency here between regular request shutdown and preloading shutdown, so that the latter needs no special handling?

This change led to a crash in our extension creating an object at rinit and accessing it in rshutdown: https://github.com/DataDog/dd-trace-php/issues/1795

==77== Invalid read of size 8
==77==    at 0x583BB80: ddtrace_close_all_open_spans (span.c:504)
==77==    by 0x582CAAB: zm_deactivate_ddtrace (ddtrace.c:897)
==77==    by 0x582CAAB: zm_deactivate_ddtrace (ddtrace.c:882)
==77==    by 0x51C81B: zend_deactivate_modules (in /usr/local/sbin/php-fpm)
==77==    by 0x4B0FB3: php_request_shutdown (in /usr/local/sbin/php-fpm)
==77==    by 0x56155FF: accel_finish_startup_preload (in /usr/local/lib/php/extensions/no-debug-non-zts-20210902/opcache.so)
==77==    by 0x5810D13: zai_interceptor_post_startup (interceptor.c:683)
==77==    by 0x515397: zend_post_startup (in /usr/local/sbin/php-fpm)
==77==    by 0x4B18DF: php_module_startup (in /usr/local/sbin/php-fpm)
==77==  Address 0x5a63b88 is 184 bytes inside a block of size 272 free'd
==77==    at 0x48C7488: free (in /usr/libexec/valgrind/vgpreload_memcheck-arm64-linux.so)
==77==    by 0x5B2B4B: zend_objects_store_del (in /usr/local/sbin/php-fpm)
==77==    by 0x5ADA7F: zend_object_std_dtor (in /usr/local/sbin/php-fpm)
==77==    by 0x5B2A3B: zend_objects_store_free_object_storage (in /usr/local/sbin/php-fpm)
==77==    by 0x504A17: zend_shutdown_executor_values (in /usr/local/sbin/php-fpm)
==77==    by 0x5613F5B: accel_preload (in /usr/local/lib/php/extensions/no-debug-non-zts-20210902/opcache.so)
==77==    by 0x56155CB: accel_finish_startup_preload (in /usr/local/lib/php/extensions/no-debug-non-zts-20210902/opcache.so)
==77==    by 0x5810D13: zai_interceptor_post_startup (interceptor.c:683)
==77==    by 0x515397: zend_post_startup (in /usr/local/sbin/php-fpm)
==77==    by 0x4B18DF: php_module_startup (in /usr/local/sbin/php-fpm)
==77==  Block was alloc'd at
==77==    at 0x48C4EC0: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm64-linux.so)
==77==    by 0x4E6FB3: __zend_malloc (in /usr/local/sbin/php-fpm)
==77==    by 0x4EBA4F: _ecalloc (in /usr/local/sbin/php-fpm)
==77==    by 0x5828C8B: ddtrace_span_data_create (ddtrace.c:404)
==77==    by 0x5181EB: object_init_ex (in /usr/local/sbin/php-fpm)
==77==    by 0x583B063: ddtrace_init_span (span.c:247)
==77==    by 0x583B063: ddtrace_push_root_span (span.c:284)
==77==    by 0x582AA9B: zm_activate_ddtrace (ddtrace.c:834)
==77==    by 0x51C67F: zend_activate_modules (in /usr/local/sbin/php-fpm)
==77==    by 0x4B0BAB: php_request_startup (in /usr/local/sbin/php-fpm)

(ping @nikic being commit author)

PHP Version

PHP 8.1+

Operating System

No response

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Empieza siguiendo accel_preload() y zend_shutdown_executor_values(), y luego compara su orden con php_request_shutdown() y php_module_shutdown(). Usa el escenario de preload reportado en PHP 8.1+ y el trace de Valgrind como referencia para la reproducción. Se considera terminado cuando el cierre de preload ya no libera objetos antes de que la ruta de cierre del módulo los necesite, sin que se produzca la lectura no válida reportada.

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
Bastante claro
Aptitud para principiantes
35/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.