1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
--TEST--
GH-8548: stream_wrapper_unregister() leaks memory
--FILE--
<?php
class Wrapper
{
public $context;
public function stream_open(string $path, string $mode, int $options): bool
{
return true;
}
public function stream_eof(): bool
{
return true;
}
}
function test() {
if (!stream_wrapper_register('foo', \Wrapper::class)) {
throw new \Exception('Could not register stream wrapper');
}
$file = fopen('foo://bar', 'r');
if (!stream_wrapper_unregister('foo')) {
throw new \Exception('Could not unregister stream wrapper');
}
$wrapper = stream_get_meta_data($file)['wrapper_data'];
if (!$wrapper instanceof Wrapper) {
throw new \Exception('Wrapper is not of expected type');
}
fclose($file);
unset($file);
}
// The first iterations will allocate space for things like the resource list
for ($i = 0; $i < 10; $i++) {
test();
}
$before = memory_get_usage();
for ($i = 0; $i < 1000; $i++) {
test();
}
$after = memory_get_usage();
var_dump($before === $after);
?>
--EXPECT--
bool(true)
|