php / php/php-src

PHP Embed SAPI not saving and restoring signal handlers.

Offen
#8,029 7 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bug SAPI: embed Status: Needs Triage
Vorherrschende Sprache
C
Sterne
40.4k
Forks
8.1k
Ø Merge
2 T. 13 Std.
Gemergte PRs (30 T.)
96

Beschreibung

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

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit den Makros PHP_EMBED_START_BLOCK() und PHP_EMBED_END_BLOCK() und verfolge, wie zend_signal_handler und der defer-Handler installiert und entfernt werden. Vergleiche den Signalzustand vor und nach einem Embed-Block; als erledigt gilt die Aufgabe, wenn Signal-Handler und die verzögerte Signalverarbeitung für den umgebenden Prozess nach PHP_EMBED_END_BLOCK() wiederhergestellt sind.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
c, php
Bereich
backend, operating-systems
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.