Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Segfault/assertion when using fibers in shutdown function #10437

Closed
danog opened this issue Jan 24, 2023 · 0 comments
Closed

Segfault/assertion when using fibers in shutdown function #10437

danog opened this issue Jan 24, 2023 · 0 comments

Comments

@danog
Copy link
Contributor

danog commented Jan 24, 2023

Description

The following code:

<?php

set_time_limit(1);

register_shutdown_function(function () {
    Fiber::getCurrent()->suspend();
});

$fiber = new Fiber(function () {
    while (1);
});
$fiber->start();

Resulted in this output on PHP 8.2.1:

[daniil@daniil-arch amp]$ php b.php
PHP Fatal error:  Maximum execution time of 1 second exceeded in /home/daniil/repos/amp/b.php on line 10
Segmentation fault (core dumped)

gdb:

(gdb) backtrace
#0  0x00005555559695d2 in zim_Fiber_suspend (execute_data=<optimized out>, return_value=0x7fffffffbc60) at /usr/src/debug/php/php-8.2.1/Zend/zend_fibers.c:744
#1  0x00005555558edab5 in ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_HANDLER (execute_data=0x7ffff4c130f0) at /usr/src/debug/php/php-8.2.1/Zend/zend_vm_execute.h:1842
#2  0x0000555555937438 in execute_ex (ex=<optimized out>) at /usr/src/debug/php/php-8.2.1/Zend/zend_vm_execute.h:55807
#3  0x00005555558b35ee in zend_call_function (fci=<optimized out>, fci_cache=<optimized out>) at /usr/src/debug/php/php-8.2.1/Zend/zend_execute_API.c:930
#4  0x00005555557c0acc in user_shutdown_function_call (zv=<optimized out>) at /usr/src/debug/php/php-8.2.1/ext/standard/basic_functions.c:1646
#5  0x00005555558d5e3a in zend_hash_apply (ht=0x7ffff4c56460, apply_func=0x5555557c0aa0 <user_shutdown_function_call>) at /usr/src/debug/php/php-8.2.1/Zend/zend_hash.c:1990
#6  0x00005555557c163f in php_call_shutdown_functions () at /usr/src/debug/php/php-8.2.1/ext/standard/basic_functions.c:1707
#7  0x0000555555854d26 in php_request_shutdown (dummy=<optimized out>) at /usr/src/debug/php/php-8.2.1/main/main.c:1818
#8  0x00005555559aab2d in do_cli (argc=2, argv=0x5555568377c0) at /usr/src/debug/php/php-8.2.1/sapi/cli/php_cli.c:1135
#9  0x0000555555643bbb in main (argc=2, argv=<optimized out>) at /usr/src/debug/php/php-8.2.1/sapi/cli/php_cli.c:1333
(gdb) zbacktrace
[0x7ffff4c13150] Fiber->suspend() [internal function]
[0x7ffff4c130f0] {closure}() /home/daniil/repos/amp/b.php:6

Resulted in this output on PHP 6838145 (dev build):

[daniil@daniil-arch amp]$ /home/daniil/repos/php-src/sapi/cli/php b.php
PHP Fatal error:  Maximum execution time of 1 second exceeded in /home/daniil/repos/amp/b.php on line 10
php: /home/daniil/repos/php-src/Zend/zend_fibers.c:849: zim_Fiber_suspend: Assertion `fiber->context.status == ZEND_FIBER_STATUS_RUNNING || fiber->context.status == ZEND_FIBER_STATUS_SUSPENDED' failed.
Aborted (core dumped)

gdb:

(gdb) backtrace
#0  __pthread_kill_implementation (threadid=<optimized out>, signo=signo@entry=6, no_tid=no_tid@entry=0) at pthread_kill.c:44
#1  0x00007ffff7a7e6b3 in __pthread_kill_internal (signo=6, threadid=<optimized out>) at pthread_kill.c:78
#2  0x00007ffff7a2e938 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26
#3  0x00007ffff7a1853d in __GI_abort () at abort.c:79
#4  0x00007ffff7a1845c in __assert_fail_base (fmt=0x7ffff7b92a50 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n",
    assertion=0x5555566c4f10 "fiber->context.status == ZEND_FIBER_STATUS_RUNNING || fiber->context.status == ZEND_FIBER_STATUS_SUSPENDED",
    file=0x5555566c49c0 "/home/daniil/repos/php-src/Zend/zend_fibers.c", line=849, function=<optimized out>) at assert.c:92
#5  0x00007ffff7a27486 in __GI___assert_fail (assertion=0x5555566c4f10 "fiber->context.status == ZEND_FIBER_STATUS_RUNNING || fiber->context.status == ZEND_FIBER_STATUS_SUSPENDED",
    file=0x5555566c49c0 "/home/daniil/repos/php-src/Zend/zend_fibers.c", line=849, function=0x5555566c51f0 <__PRETTY_FUNCTION__.4> "zim_Fiber_suspend") at assert.c:101
#6  0x0000555555b93869 in zim_Fiber_suspend (execute_data=0x7ffff52161c0, return_value=0x7fffffffbaa0) at /home/daniil/repos/php-src/Zend/zend_fibers.c:849
#7  0x0000555555acb820 in ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_HANDLER () at /home/daniil/repos/php-src/Zend/zend_vm_execute.h:1842
#8  0x0000555555b42346 in execute_ex (ex=0x7ffff5216150) at /home/daniil/repos/php-src/Zend/zend_vm_execute.h:56061
#9  0x0000555555a6d29c in zend_call_function (fci=0x7ffff525a1e0, fci_cache=0x7ffff525a220) at /home/daniil/repos/php-src/Zend/zend_execute_API.c:938
#10 0x00005555558fabb5 in user_shutdown_function_call (zv=0x7ffff525f188) at /home/daniil/repos/php-src/ext/standard/basic_functions.c:1640
#11 0x0000555555aa3c1a in zend_hash_apply (ht=0x7ffff525ba80, apply_func=0x5555558fab6c <user_shutdown_function_call>) at /home/daniil/repos/php-src/Zend/zend_hash.c:2000
#12 0x00005555558fae4f in php_call_shutdown_functions () at /home/daniil/repos/php-src/ext/standard/basic_functions.c:1701
#13 0x00005555559df2f5 in php_request_shutdown (dummy=0x0) at /home/daniil/repos/php-src/main/main.c:1820
#14 0x0000555555c05f8e in do_cli (argc=2, argv=0x555556a387c0) at /home/daniil/repos/php-src/sapi/cli/php_cli.c:1135
#15 0x0000555555c06427 in main (argc=2, argv=0x555556a387c0) at /home/daniil/repos/php-src/sapi/cli/php_cli.c:1333
(gdb) zbacktrace
[0x7ffff52161c0] Fiber->suspend() [internal function]
[0x7ffff5216150] {closure}() /home/daniil/repos/amp/b.php:6

But I expected this output instead: No segmentation fault

PHP Version

PHP 8.2.1

Operating System

Arch linux

MaxSem added a commit to MaxSem/php-src that referenced this issue Jan 24, 2023
trowski added a commit to trowski/php-src that referenced this issue Jan 25, 2023
trowski added a commit to trowski/php-src that referenced this issue Jan 28, 2023
trowski added a commit that referenced this issue Jan 28, 2023
* PHP-8.1:
  Fix GH-10437: Set active fiber to null on bailout (#10443)
trowski added a commit that referenced this issue Jan 28, 2023
* PHP-8.2:
  [ci skip] NEWS
  Fix GH-10437: Set active fiber to null on bailout (#10443)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants
@danog @Girgias and others