php / php/php-src

pcntl_signal for SIGILL/SIGFPE/SIGSEGV/SIGBUS should add addr as int or string, not double

Offen
#9,815 1 Kommentar 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

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

Beschreibung

Description

add_assoc_double_ex is called in combination with a cast to zend_long - add_assoc_long_ex may have been intended? (There's one question about what's best for how negative zend_longs should be handled (high bit of pointer set), where pointers aren't actually negative) - keeping them negative seems better than sometimes using an int and sometimes using a string.

Motivation: Use 64-bit integers when it can properly represent the value. Don't use doubles when they might lose precision (e.g. virtual memory may allow numbers over the largest integer a double can safely represent?)
(not a priority for me, I'm just really surprised to see a float)

The following code:

<?php // Hackish example of a proof of concept userland signal handler to debug in an emergency,
// note that running any php snippets may fail again or have unexpected effects if php has already segfaulted
pcntl_signal(SIGSEGV, function (...$args) {
    echo "In signal handler\n";
    flush();
    var_dump($args);
    flush();
    debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
    flush();
    exit(139);
});
pcntl_async_signals(true);
sleep(20);
// call 'kill -USR1 PID_OF_PHP' to attempt to simulate a segfault
// ext/pcntl/pcntl.c
			case SIGILL:
			case SIGFPE:
			case SIGSEGV:
			case SIGBUS:
				add_assoc_double_ex(user_siginfo, "addr", sizeof("addr")-1, (zend_long)siginfo->si_addr);
				break;

Resulted in this output:

In signal handler
array(2) {
  [0]=>
  int(11)
  [1]=>
  array(4) {
    ["signo"]=>
    int(11)
    ["errno"]=>
    int(0)
    ["code"]=>
    int(0)
    ["addr"]=>
    float(4294967486499)
  }
}
#0  {closure}(11, Array ([signo] => 11,[errno] => 0,[code] => 0,[addr] => 4294967486499)) called at [/usr/local/tyson/php-src/test.php:12]

But I expected this output instead on 64-bit platforms:

    ["addr"]=>
    int(4294967486499)
PHP Version

5.x-8.3-dev

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 in ext/pcntl/pcntl.c mit der im Issue gezeigten Behandlung von SIGILL, SIGFPE, SIGSEGV und SIGBUS und führe dann das bereitgestellte PHP-Signal-Handler-Beispiel auf einer 64-Bit-Plattform aus. Als abgeschlossen gilt die Arbeit, wenn der Wert addr als Integer dargestellt wird, sofern er sicher als solcher dargestellt werden kann, statt als Double; das Issue lässt außerdem offen, wie die Behandlung von negativem zend_long bei Zeigern mit gesetztem höchstem Bit gelöst werden soll.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

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

Neue Issues direkt in Ihr Postfach

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