php / php/php-src

PHP Embed SAPI not saving and restoring signal handlers.

Open
#8,029 7 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Bug SAPI: embed Status: Needs Triage
Dominant language
C
Stars
40.4k
Forks
8.1k
Avg merge
2d 13h
Merged PRs (30d)
96

Description

Description

I would expect the the execution context to be restored following the PHP_EMBED_END_BLOCK() macro, but this doesn't seem to be the case for signal handlers.

here is a toy function to call a php function from a specified file:

/* Early work to call a php function from a specified script file */
void
call_php_function(char *file_name, char *function_name)
{
    zend_file_handle file_handle;
    zval retval = {0};
    zend_fcall_info fci = {0};
    zend_fcall_info_cache fci_cache = {0};

    sigset_t       oldsigset;
    struct sigaction oldsigaction[32] = {0,};

    some_signal_save_function(&oldsigset, oldsigaction);

    PHP_EMBED_START_BLOCK(0, NULL)
        zend_stream_init_filename(&file_handle, file_name);

        php_execute_script(&file_handle);

        ZVAL_STRING(&fci.function_name, function_name);

        fci.size = sizeof fci;
        fci.retval = &retval;

        zend_call_function(&fci, &fci_cache);
    PHP_EMBED_END_BLOCK()

    some_signal_restore_function(&oldsigset, oldsigaction);
}

Without the signal save/restore wrapping the embed block, the zend_signal_handler and defer handler is still handling the dispatching of signals, which is likely not what a user would want once outside an embed block.

PHP Version

7.4.27

Operating System

No response

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the PHP_EMBED_START_BLOCK() and PHP_EMBED_END_BLOCK() macros and trace how zend_signal_handler and the defer handler are installed and removed. Compare the signal state before and after an embed block; done means signal handlers and deferred signal handling are restored for the surrounding process after PHP_EMBED_END_BLOCK().

Written by the indexing model from the issue text.

Assessment

Tech stack
c, php
Domain
backend, operating-systems
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.