Segfault with observer API on max execution time during php -r
Personne n'a encore pris cette issue.
- Langage dominant
- C
- Étoiles
- 40.4k
- Forks
- 8.1k
- Merge moyen
- 2 j 13 h
- PR mergées (30 j)
- 96
Description
Description
The following command:
sapi/cli/php -n \
-d 'max_execution_time=1' \
-d 'zend_test.observer.enabled=1' \
-d 'zend_test.observer.observe_all=1' \
-r 'echo "test\n"; crc32("test"); for (;;) {}'
Resulted in this output:
<!-- init 'Command line code' -->
<file 'Command line code'>
test
Fatal error: Maximum execution time of 1 second exceeded in Command line code on line 1
zsh: bus error sapi/cli/php -n -d 'max_execution_time=1' -d 'zend_test.observer.enabled=1' -
The execution results in a bus error instead of a segmentation fault, since the address which is jumped to is not properly aligned. While debugging this I also saw segmentation faults from time to time.
I expect neither a bus error nor a segmentation fault to occur, when executing that command.
Here is the output of lldb:
(lldb) run
Process 92890 launched: '/Users/florian/projects/php/php-src/sapi/cli/php' (arm64)
<!-- init 'Command line code' -->
<file 'Command line code'>
test
Fatal error: Maximum execution time of 1 second exceeded in Command line code on line 1
Process 92890 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=257, address=0x800000017c9e6865)
frame #0: 0xffff80017c9e6865
error: memory read failed for 0xffff80017c9e6800
Target 0: (php) stopped.
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=257, address=0x800000017c9e6865)
* frame #0: 0xffff80017c9e6865
frame #1: 0x00000001002a9ee0 php`zend_observer_fcall_end(execute_data=0x0000000101212020, return_value=0x0000000000000000) at zend_observer.c:220:3 [opt]
frame #2: 0x00000001002a9fdc php`zend_observer_fcall_end_all at zend_observer.c:240:4 [opt]
frame #3: 0x0000000100192a54 php`php_request_shutdown(dummy=0x0000000000000000) at main.c:1798:3 [opt]
frame #4: 0x00000001002f1a54 php`do_cli(argc=10, argv=0x0000600002600120) at php_cli.c:1135:3 [opt]
frame #5: 0x00000001002f0114 php`main(argc=<unavailable>, argv=<unavailable>) at php_cli.c:1367:18 [opt]
frame #6: 0x00000001005ad088 dyld`start + 516
(lldb) frame select 1
php was compiled with optimization - stepping may behave oddly; variables may not be available.
frame #1: 0x00000001002a9ee0 php`zend_observer_fcall_end(execute_data=0x0000000101212020, return_value=0x0000000000000000) at zend_observer.c:220:3 [opt]
217
218 zend_observer_fcall_end_handler *possible_handlers_end = handler + zend_observers_fcall_list.count;
219 do {
-> 220 (*handler)(execute_data, return_value);
221 } while (++handler != possible_handlers_end && *handler != NULL);
222
223 if (first_observed_frame == execute_data) {
The output was generated on the current PHP-8.1 branch (commit dd89acaf4985fa21ebd6cc9b09615ef6b0a719fc).
So far I only was able to reproduce the problem with php -r – not by executing a PHP file.
PHP Version
PHP 8.1.7
Operating System
Mac OS X 12.3.1 (ARM)
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Reproduisez l’échec avec la commande sapi/cli/php -r fournie et inspectez le chemin du callback de l’observer dans zend_observer.c, en particulier zend_observer_fcall_end(), ainsi que php_request_shutdown() dans main.c. Comparez le comportement de php -r avec l’exécution depuis un fichier PHP ; c’est terminé lorsque la commande se termine sans erreur de bus ni segmentation fault.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- c, php
- Domaine
- backend
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100