HashTable use-after-destroy in function table via stream wrapper magic __call() with nested redeclaration
Ouverte
Personne n'a encore pris cette issue.
Bug
Category: Streams
Extension: standard
Status: Verified
- Langage dominant
- C
- Étoiles
- 40.4k
- Forks
- 8.2k
- Merge moyen
- 2 j 13 h
- PR mergées (30 j)
- 96
Description
Description
The following code:
<?php
class Loader {
function stream_open() {
return true;
}
function __call($m, $a) {
$map[$obj] = putenv("LA=Gx$g_lang");
function __call($m, $a) {}
}
}
stream_wrapper_register('abc', 'Loader');
require 'abc://';
Resulted in this output:
/path/to/php-src/Zend/zend_hash.c(1555) : ht=0x5589df607568 is already destroyed
php: /path/to/php-src/Zend/zend_hash.c:73: _zend_is_inconsistent: Assertion `0' failed.
Aborted
Commit:
824c3891281bb4deb5a1aa245313a6c6b0ea786f
Build configuration:
CC="clang" CXX="clang++" CFLAGS="-fsanitize=address -g -O0" CXXFLAGS="-fsanitize=address -g -O0" LDFLAGS="-fsanitize=address" ./buildconf --force && ./configure --enable-debug --enable-address-sanitizer --disable-shared --with-pic --enable-mbstring --with-zlib
PHP Version
PHP 8.6.0-dev (cli) (built: Dec 6 2025 16:29:29) (NTS DEBUG)
Copyright (c) The PHP Group
Zend Engine v4.6.0-dev, Copyright (c) Zend Technologies
with Zend OPcache v8.6.0-dev, Copyright (c), by Zend Technologies
Operating System
Ubuntu 22.04
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Reproduisez l’échec avec l’extrait PHP et la configuration de compilation de débogage de l’issue, puis commencez par lire zend_hash.c autour de l’assertion signalée. Suivez le __call() du stream wrapper et le chemin de redéclaration de fonctions imbriquées ; le travail est terminé lorsque l’exemple ne signale plus de table de hachage détruite et n’est plus interrompu.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- c, php
- Domaine
- compilers
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100