From 66bfd180e903ae5a26160523db1d8f25bf798d2c Mon Sep 17 00:00:00 2001 From: Jorg Sowa Date: Mon, 15 Jun 2026 23:22:56 +0200 Subject: [PATCH] ext/spl: ignore leading namespace separator in spl_autoload() Strip a leading "\\" before lowercasing, mirroring zend_lookup_class_ex(), so both spellings resolve identically. --- ext/spl/php_spl.c | 7 ++++++- .../tests/spl_autoload_leading_backslash.phpt | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 ext/spl/tests/spl_autoload_leading_backslash.phpt diff --git a/ext/spl/php_spl.c b/ext/spl/php_spl.c index 78315e9880b4..42fbeba71dbe 100644 --- a/ext/spl/php_spl.c +++ b/ext/spl/php_spl.c @@ -310,7 +310,12 @@ PHP_FUNCTION(spl_autoload) pos_len = (int)ZSTR_LEN(file_exts); } - lc_name = zend_string_tolower(class_name); + if (ZSTR_VAL(class_name)[0] == '\\') { + lc_name = zend_string_alloc(ZSTR_LEN(class_name) - 1, 0); + zend_str_tolower_copy(ZSTR_VAL(lc_name), ZSTR_VAL(class_name) + 1, ZSTR_LEN(class_name) - 1); + } else { + lc_name = zend_string_tolower(class_name); + } while (pos && *pos && !EG(exception)) { pos1 = strchr(pos, ','); if (pos1) { diff --git a/ext/spl/tests/spl_autoload_leading_backslash.phpt b/ext/spl/tests/spl_autoload_leading_backslash.phpt new file mode 100644 index 000000000000..ff8ae3234eee --- /dev/null +++ b/ext/spl/tests/spl_autoload_leading_backslash.phpt @@ -0,0 +1,18 @@ +--TEST-- +spl_autoload(): a leading "\" in the class name is ignored +--FILE-- + +--EXPECT-- +bool(true) +bool(true)