From 1695a9d206ce3f8b4d243679f83c6cba29e18a86 Mon Sep 17 00:00:00 2001 From: PurHur Date: Sun, 28 Jun 2026 07:47:02 +0000 Subject: [PATCH] Reject class_alias() on internal classes to match Zend (#9211) Throw ValueError when the original class is internal in VM and JIT registerClassAlias paths; add compliance guard and maintainer repro. Co-authored-by: Cursor --- lib/JIT/Builtin/Type/Object_.php | 4 +++- lib/VM/Context.php | 5 +++++ .../cases/stdlib/class_alias_internal.phpt | 15 +++++++++++++++ .../repro/maintainer_gap_class_alias_internal.php | 11 +++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 test/compliance/cases/stdlib/class_alias_internal.phpt create mode 100644 test/repro/maintainer_gap_class_alias_internal.php 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";