Skip to content

Use-after-free of self-freeing MultipleIterator children #21927

Description

@iluuu1994

Description

Originally reported by @flex0geek.

The following code:

<?phpclass FreeSelfOnRewind implements Iterator {
publicfunction__construct(privateMultipleIterator$parent) {}
publicfunctionrewind(): void {
$this->parent->detachIterator($this);
var_dump($this);
}
publicfunctioncurrent(): mixed { return0; }
publicfunctionkey(): mixed { return0; }
publicfunctionnext(): void {}
publicfunctionvalid(): bool { returnfalse; }
}
$mi = newMultipleIterator();
$mi->attachIterator(newFreeSelfOnRewind($mi));
$mi->rewind();

Resulted in this output:

Use-after-free

The same goes for various other MultipleIterator methods that call methods on the child iterator without addref.

PHP Version

8.4+

Operating System

No response

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions