php / php/php-src

Inconsistent result stream with or without a function wrapper

Offen
#19,525 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bug Category: Streams Status: Needs Triage
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
class Loader {
    public $context;
    private $position;
    private $data;
    public function stream_open($path, $mode, $options, &$opened_path)  {
        $this->data = '<' . "?php \n\"\";ll l\n ?" . '>';
        $this->position = 0;
        return true;
    }
    function stream_read($count) {
        $ret = substr($this->data, $this->position, $count);
        $this->position += strlen($ret);
        return $ret;
    }
    function stream_eof() {
        return $this->position >= strlen($this->data);
    }
    function stream_flush() {
        var_dump("flush!");
    }
    function stream_close() {
        @unlink(__DIR__."/bug38779.txt");
        var_dump("close!");
    }
}
stream_wrapper_register('Loader', 'Loader');
$fp = fopen ('Loader://qqq.php', 'r');
$filename = __DIR__."/bug38779.txt";
$fp1 = fopen($filename, "w");
fwrite($fp1, "<"."?php blah blah?".">");
fclose($fp1);
include $filename;

Resulted in this output:

Parse error: syntax error, unexpected identifier "blah" in /tmp/bug38779.txt on line 1
string(6) "close!"

The following code:

<?php
function foo() 
{
class Loader {
    public $context;
    private $position;
    private $data;
    public function stream_open($path, $mode, $options, &$opened_path)  {
        $this->data = '<' . "?php \n\"\";ll l\n ?" . '>';
        $this->position = 0;
        return true;
    }
    function stream_read($count) {
        $ret = substr($this->data, $this->position, $count);
        $this->position += strlen($ret);
        return $ret;
    }
    function stream_eof() {
        return $this->position >= strlen($this->data);
    }
    function stream_flush() {
        var_dump("flush!");
    }
    function stream_close() {
        @unlink(__DIR__."/bug38779.txt");
        var_dump("close!");
    }
}
stream_wrapper_register('Loader', 'Loader');
$fp = fopen ('Loader://qqq.php', 'r');
$filename = __DIR__."/bug38779.txt";
$fp1 = fopen($filename, "w");
fwrite($fp1, "<"."?php blah blah?".">");
fclose($fp1);
include $filename;
}
foo();

Resulted in this output:

Parse error: syntax error, unexpected identifier "blah" in /tmp/bug38779.txt on line 1
PHP Version
nightly
Operating System

No response

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, die beiden bereitgestellten PHP-Skripte im Nightly-Build zu reproduzieren und das Verhalten des stream wrapper und von include innerhalb und außerhalb des Funktions-Wrappers zu vergleichen. Verfolge, wann der Wrapper geschlossen wird, und bestimme das erwartete konsistente Ergebnis, bevor du einen fokussierten Regressionstest hinzufügst; das Issue nennt keine vorhandene Testdatei oder keinen Implementierungseinstiegspunkt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
php
Bereich
compilers
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Muss geklärt werden
Anfängerfreundlichkeit
28/100

Neue Issues direkt in Ihr Postfach

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