diff --git a/lib/JIT/Builtin/Type/Object_.php b/lib/JIT/Builtin/Type/Object_.php index e4465442509..a815779f872 100755 --- a/lib/JIT/Builtin/Type/Object_.php +++ b/lib/JIT/Builtin/Type/Object_.php @@ -1827,7 +1827,9 @@ public function registerClassAlias(string $original, string $alias): bool $classId = $this->classes[$originalLc]; if (isset($this->externalOnlyClassIds[$classId])) { - return false; + throw new \ValueError( + 'class_alias(): Argument #1 ($class) must be a user-defined class name, internal class name given' + ); } $this->classes[$aliasLc] = $classId; diff --git a/lib/VM/Context.php b/lib/VM/Context.php index 4338e588ede..318153bc9bc 100755 --- a/lib/VM/Context.php +++ b/lib/VM/Context.php @@ -544,6 +544,11 @@ public function registerClassAlias(string $original, string $alias, bool $autolo } $entry = $this->classes[$originalLc]; + if ($entry->isInternal) { + throw new \ValueError( + 'class_alias(): Argument #1 ($class) must be a user-defined class name, internal class name given' + ); + } $this->classes[$aliasLc] = $entry; $this->classAliases[$aliasLc] = $originalLc; if ($entry->isEnum) { diff --git a/test/compliance/cases/stdlib/class_alias_internal.phpt b/test/compliance/cases/stdlib/class_alias_internal.phpt new file mode 100644 index 00000000000..b1165ba8750 --- /dev/null +++ b/test/compliance/cases/stdlib/class_alias_internal.phpt @@ -0,0 +1,15 @@ +--TEST-- +stdlib class_alias() rejects internal class targets (#9211, Zend/zend_builtin_functions.c) +--FILE-- +getMessage(), "\n"; +} +var_export(class_exists('SC9211', false)); +echo "\n"; +--EXPECT-- +ValueError: class_alias(): Argument #1 ($class) must be a user-defined class name, internal class name given +false diff --git a/test/repro/maintainer_gap_class_alias_internal.php b/test/repro/maintainer_gap_class_alias_internal.php new file mode 100644 index 00000000000..f8bb8750c23 --- /dev/null +++ b/test/repro/maintainer_gap_class_alias_internal.php @@ -0,0 +1,11 @@ +getMessage(), "\n"; +} +var_export(class_exists('SC2', false)); +echo "\n";