[php-src] Issue #9815: pcntl_signal for SIGILL/SIGFPE/SIGSEGV/SIGBUS should add addr as int or string, not double

From: Date: Mon, 24 Oct 2022 02:42:49 +0000
Subject: [php-src] Issue #9815: pcntl_signal for SIGILL/SIGFPE/SIGSEGV/SIGBUS should add addr as int or string, not double
Groups: php.bugs 
Request: Send a blank email to php-bugs+get-242670@lists.php.net to get a copy of this message
Issue: https://github.com/php/php-src/issues/9815 Author: TysonAndre ### 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 <?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 ``` ```c // 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_

« previous php.bugs (#242670) next »