[php-src] Issue #22905: Reflection exception messages truncate on null bytes
[email protected] (DanielEScherzer) Mon, 27 Jul 2026 23:55:47 +0000
| Newsgroups | php.bugs |
|---|---|
| Message-ID | <[email protected]> |
Issue: https://github.com/php/php-src/issues/22905
Author: DanielEScherzer
After #22681 I looked into exception messages:
<details>
<summary>Reflection*::getAttributes() with ReflectionAttribute::IS_INSTANCEOF</summary>
```php
<?php
class Demo {}
$r = new ReflectionClass(Demo::class);
$r->getAttributes("foo\0bar", ReflectionAttribute::IS_INSTANCEOF);
```
</details>
<details>
<summary>ReflectionFunction::__construct()</summary>
```php
<?php
new ReflectionFunction("foo\0bar");
```
</details>
<details>
<summary>ReflectionParameter::__construct() with string function</summary>
```php
<?php
new ReflectionParameter("foo\0bar", 0);
```
</details>
<details>
<summary>ReflectionParameter::__construct() with array with class name</summary>
```php
<?php
new ReflectionParameter(["foo\0bar", ""], 0);
```
</details>
<details>
<summary>ReflectionParameter::__construct() with array with method name</summary>
```php
<?php
class Demo {}
new ReflectionParameter([Demo::class, "foo\0bar"], 0);
```
</details>
<details>
<summary>ReflectionMethod::__construct() with class name</summary>
```php
<?php
new ReflectionMethod("foo\0bar", "");
```
</details>
<details>
<summary>ReflectionMethod::__construct() with method name</summary>
```php
<?php
class Demo {}
new ReflectionMethod(Demo::class, "foo\0bar");
```
</details>
the above two should also apply to ReflectionMethod::createFromMethodName() - they share the same lookup code
<details>
<summary>ReflectionClassConstant::__construct() with class name</summary>
```php
<?php
new ReflectionClassConstant("foo\0bar", "");
```
</details>
<details>
<summary>ReflectionClassConstant::__construct() with constant name</summary>
```php
<?php
class Demo {}
new ReflectionClassConstant(Demo::class, "foo\0bar");
```
</details>
<details>
<summary>ReflectionClass::__construct()</summary>
```php
<?php
new ReflectionClass("foo\0bar");
```
</details>
<details>
<summary>ReflectionClass::getStaticPropertyValue()</summary>
```php
<?php
class Demo {}
$r = new ReflectionClass(Demo::class);
$r->getStaticPropertyValue("foo\0bar");
```
</details>
<details>
<summary>ReflectionClass::setStaticPropertyValue()</summary>
```php
<?php
class Demo {}
$r = new ReflectionClass(Demo::class);
$r->setStaticPropertyValue("foo\0bar", 123);
```
</details>
<details>
<summary>ReflectionClass::getMethod()</summary>
```php
<?php
class Demo {}
$r = new ReflectionClass(Demo::class);
$r->getMethod("foo\0bar");
```
</details>
<details>
<summary>ReflectionClass::getProperty()</summary>
```php
<?php
class Demo {}
$r = new ReflectionClass(Demo::class);
$r->getProperty("foo\0bar");
```
</details>
<details>
<summary>ReflectionClass::isSubclassOf()</summary>
```php
<?php
class Demo {}
$r = new ReflectionClass(Demo::class);
$r->isSubclassOf("foo\0bar");
```
</details>
<details>
<summary>ReflectionClass::implementsInterface()</summary>
```php
<?php
class Demo {}
$r = new ReflectionClass(Demo::class);
$r->implementsInterface("foo\0bar");
```
</details>
<details>
<summary>ReflectionProperty::__construct() with class name</summary>
```php
<?php
new ReflectionProperty("foo\0bar", "");
```
</details>
<details>
<summary>ReflectionProperty::__construct() with property name</summary>
```php
<?php
class Demo {}
new ReflectionProperty(Demo::class, "foo\0bar");
```
</details>
<details>
<summary>ReflectionProperty::skipLazyInitialization() with property name</summary>
```php
<?php
$o = (object)["foo\0bar" => "baz"];
$r = new ReflectionProperty($o, "foo\0bar");
$r->skipLazyInitialization($o);
```
</details>
also affects anything else using `reflection_property_check_lazy_compatible()`
<details>
<summary>ReflectionEnum::getCase() with missing case</summary>
```php
<?php
enum Demo {}
$r = new ReflectionEnum(Demo::class);
$r->getCase("foo\0bar");
```
</details>
<details>
<summary>ReflectionConstant::__construct()</summary>
```php
<?php
new ReflectionConstant("foo\0bar");
```
</details>