Inconsistent result stream with or without a function wrapper
Open
Nobody has claimed this yet.
Bug
Category: Streams
Status: Needs Triage
- Dominant language
- C
- Stars
- 40.4k
- Forks
- 8.1k
- Avg merge
- 2d 13h
- Merged PRs (30d)
- 96
Description
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
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reproducing the two provided PHP scripts on the nightly build and compare the stream wrapper and include behavior inside and outside the function wrapper. Trace when the wrapper is closed and determine the expected consistent result before adding a focused regression test; the issue does not name an existing test file or implementation entry point.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- php
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 28/100