php / php/php-src

PHP incorrectly closes file handles when used to replace STDIN/STDOUT/STDERR

Offen
#11,399 7 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Category: Streams Feature SAPI: cli
Vorherrschende Sprache
C
Sterne
40.4k
Forks
8.1k
Ø Merge
2 T. 13 Std.
Gemergte PRs (30 T.)
96

Beschreibung

Description

The following code:

<?php
  fclose(STDIN);
  fclose(STDOUT);
  fclose(STDERR);
  fopen('/dev/null', 'r');
  fopen('/dev/null', 'w');
  fopen('/dev/null', 'w');

  exec("dig +noall +answer -t ns -q 'www.google.com'", $out, $ret);
  file_put_contents('ret.txt', $ret . "\n");

Resulted in exec failing with the return code 134 as seen in ret.txt

PHP's garbage collection seems to have not taken into account that the file handles opened are now in use as stdin/stdout/stderr. Obviously this can be worked around by storing the result of fopen into some global vars, but IMO this is a bug.

PHP Version

PHP 8.2.6

Operating System

Debian 11

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne damit, das PHP 8.2.6-Beispiel unter Debian 11 zu reproduzieren, wobei du dich auf den Ersatz von STDIN, STDOUT und STDERR sowie die anschließende Garbage Collection konzentrierst. Verfolge, wie diese Standard-Streams behandelt werden, bevor exec ausgeführt wird. Als erledigt gilt die Aufgabe, wenn der Befehl nicht mehr mit dem Rückgabecode 134 fehlschlägt, wenn die Ersatz-Handles nicht in globalen Variablen beibehalten werden.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
php
Bereich
operating-systems
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.