HTTP wrapper leaks dechunk filter when header parsing fails after Transfer-Encoding: chunked
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 78/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Domaine
- backend, networking
Piste de recherche
Commencez dans ext/standard/http_fopen_wrapper.c, au niveau de l’analyse des en-têtes de réponse et du chemin de nettoyage out: ; l’issue indique où le filtre de déchunk est créé et où le nettoyage l’ignore après un en-tête mal formé. Reproduisez le problème avec les commandes server.php et client.php fournies, puis vérifiez le rapport de fuites de la compilation de débogage. Le travail est terminé lorsque la requête échouée ne signale aucune fuite et qu’une réponse chunked bien formée fonctionne toujours.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Description
The following code:
server.php (run first, php server.php):
<?php
$srv = stream_socket_server("tcp://127.0.0.1:18231", $errno, $errstr);
$conn = stream_socket_accept($srv);
while (($line = fgets($conn, 8192)) !== false) { if (trim($line) === '') break; }
// Transfer-Encoding: chunked, then a malformed header line
fwrite($conn, "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\nBrokenHeaderNoColon\r\n\r\n");
fclose($conn);
client.php (debug build, php -d report_memleaks=1 client.php):
<?php
@file_get_contents("http://127.0.0.1:18231/");
Resulted in this output:
ext/standard/filters.c(1885) : Freeing 0x... (16 bytes), script=.../client.php
main/streams/filter.c(267) : Freeing 0x... (80 bytes), script=.../client.php
=== Total 2 memory leaks detected ===
But I expected this output instead:
(no leaks reported)
Root cause: when the response carries Transfer-Encoding: chunked, the wrapper creates a dechunk filter while parsing headers (php_stream_filter_create, ext/standard/http_fopen_wrapper.c:379 in 8.5.12, :366 on master). If a later header line is malformed, header_info.error is set, the caller closes the stream and jumps to out: (master :1052-1058). The out: cleanup only appends the filter to the stream's readfilters when stream != NULL (master :1257-1259), so on the error path the filter is never freed. Per failed request this leaks the php_stream_filter struct (80 bytes) plus the dechunk filter data (16 bytes).
Reproduces on current master (8.7.0-dev) as well.
Suggested patch (verified against master: repro reports 0 leaks after patching; well-formed chunked responses unaffected):
--- a/ext/standard/http_fopen_wrapper.c
+++ b/ext/standard/http_fopen_wrapper.c
@@ -1230,6 +1230,13 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
efree(header_info.location);
}
+ /* On the error path stream is NULL and the filter is never appended
+ * to readfilters below, so it must be freed here. */
+ if (header_info.transfer_encoding != NULL && stream == NULL) {
+ php_stream_filter_free(header_info.transfer_encoding);
+ header_info.transfer_encoding = NULL;
+ }
+
if (resource) {
php_uri_struct_free(resource);
}
PHP Version
PHP 8.5.12 (also reproduces on master, 8.7.0-dev)
Operating System
Linux x86_64
- Langage dominant
- C
- Étoiles
- 40.7k
- Forks
- 8.3k
- Merge moyen
- 2 j 15 h
- PR mergées (30 j)
- 155
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire 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.
Autres issues de php/php-src
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 1 jour
-
Case-insensitive substr_compare, ksort, krsort are still locale-dependentPeut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. OuverteBug Status: Needs Triage
Difficulté 2/5 1-3 heures Accessibilité débutants 73/100
php/php-src#24552 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
HTTP wrapper leaks Location buffer when an empty Location header is followed by another Location headerPeut-être pris @bercedev l’a pris il y a 2 jours. OuverteBug Category: Streams Status: Verified
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
`Time\Duration::__unserialize()` accepts a "negative zero" payload.Peut-être pris @TimWolla l’a pris aujourd’hui. OuverteBug Status: Needs Triage
Difficulté 2/5 1-3 heures Accessibilité débutants 71/100
php/php-src#24505 · 2 commentaires · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
-
master: part of the mbstring bailout fix got lost in a mergePeut-être pris @lazerg l’a pris il y a 2 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de php/php-src
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
zephyrproject-rtos/zephyr#123423 ·
Les mainteneurs répondent en général sous 2 jours
-
dspromote: /etc/exports uses -alldirs on non-mount-point directories, so mountd exports nothingOuvertebug
Difficulté 2/5 1-3 heures Accessibilité débutants 83/100
nextbsd/nextbsd-userland#434 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 77/100
Les mainteneurs répondent en général sous 1 jour
-
[YSQL] Local-node initdb reads postgres.bki, but YB clusters bootstrap only from yb_postgres.bkiOuvertearea/ysql kind/enhancement priority/low status/awaiting-triage
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
yugabyte/yugabyte-db#35763 ·
Les mainteneurs répondent en général sous 1 jour
-
[mimalloc] update to 3.6.0Ouvertecategory:port-update
Difficulté 2/5 1-3 heures Accessibilité débutants 66/100
Les mainteneurs répondent en général sous 2 jours