php / php/php-src

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

Ouverte
#9,815 1 commentaire 1 réaction 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Bug Status: Needs Triage
Langage dominant
C
Étoiles
40.4k
Forks
8.2k
Merge moyen
2 j 13 h
PR mergées (30 j)
96

Description

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

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez dans ext/pcntl/pcntl.c par le traitement de SIGILL, SIGFPE, SIGSEGV et SIGBUS présenté dans l’issue, puis exécutez l’exemple fourni de gestionnaire de signaux PHP sur une plateforme 64 bits. Le travail est terminé lorsque la valeur addr est représentée comme un entier lorsqu’elle peut l’être sans risque, plutôt que comme un double ; l’issue laisse également à résoudre la gestion d’un zend_long négatif pour les pointeurs dont le bit de poids fort est défini.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
c, php
Domaine
operating-systems
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
42/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.