mirror of
https://github.com/php/php-src.git
synced 2026-03-24 00:02:20 +01:00
Fix GH-15908 and GH-15026: leak / assertion failure in streams.c
This was first reported as a leak in GH-15026, but was mistakingly believed to be a false positive. Then an assertion was added and it got triggered in GH-15908. This fixes the leak. Upon merging into master the assertion should be removed as well. Closes GH-15924.
This commit is contained in:
4
NEWS
4
NEWS
@@ -26,6 +26,10 @@ PHP NEWS
|
||||
. Fixed bug GH-15613 (overflow on unpack call hex string repeater).
|
||||
(David Carlier)
|
||||
|
||||
- Streams:
|
||||
. Fixed bugs GH-15908 and GH-15026 (leak / assertion failure in streams.c).
|
||||
(nielsdos)
|
||||
|
||||
- XML:
|
||||
. Fixed bug GH-15868 (Assertion failure in xml_parse_into_struct after
|
||||
exception). (nielsdos)
|
||||
|
||||
38
ext/standard/tests/streams/gh15908.phpt
Normal file
38
ext/standard/tests/streams/gh15908.phpt
Normal file
@@ -0,0 +1,38 @@
|
||||
--TEST--
|
||||
GH-15908 (leak / assertion failure in streams.c)
|
||||
--CREDITS--
|
||||
YuanchengJiang
|
||||
LuMingYinDetect
|
||||
--FILE--
|
||||
<?php
|
||||
class TestStream {
|
||||
public $context;
|
||||
private $s = 0;
|
||||
function stream_open($path, $mode, $options, &$opened_path) {
|
||||
return true;
|
||||
}
|
||||
function stream_read($count) {
|
||||
echo "Read done\n";
|
||||
if ($this->s++ == 0)
|
||||
return "a\nbb\ncc";
|
||||
return "";
|
||||
}
|
||||
function stream_eof() {
|
||||
return $this->s >= 2;
|
||||
}
|
||||
}
|
||||
touch(__DIR__."/gh15908.tmp");
|
||||
stream_wrapper_register("test", "TestStream");
|
||||
$f = fopen("test://", "r");
|
||||
try {
|
||||
file_put_contents(__DIR__."/gh15908.tmp", $f, FILE_USE_INCLUDE_PATH, $f);
|
||||
} catch (Error $e) {
|
||||
echo $e->getMessage(), "\n";
|
||||
}
|
||||
?>
|
||||
--CLEAN--
|
||||
<?php
|
||||
@unlink(__DIR__."/gh15908.tmp");
|
||||
?>
|
||||
--EXPECT--
|
||||
file_put_contents(): supplied resource is not a valid Stream-Context resource
|
||||
@@ -2175,6 +2175,9 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(const char *path, const char *mod
|
||||
options &= ~USE_PATH;
|
||||
}
|
||||
if (EG(exception)) {
|
||||
if (resolved_path) {
|
||||
zend_string_release_ex(resolved_path, false);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user