[php-src] Issue #9815: pcntl_signal for SIGILL/SIGFPE/SIGSEGV/SIGBUS should add addr as int or string, not double
| From: | TysonAndre | 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_