summaryrefslogtreecommitdiff
path: root/Zend/zend_execute_API.c
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2020-06-10 14:50:35 +0200
committerNikita Popov <nikita.ppv@gmail.com>2020-06-10 14:50:35 +0200
commit1c74bab8e61199c400217afc4082ee2cd9b722e3 (patch)
treefea084858e5b06aa125fa907038840552c20f3a7 /Zend/zend_execute_API.c
parentbda099a3c49e8127e7c37bcf0f252e2dd3c81c6c (diff)
downloadphp-git-1c74bab8e61199c400217afc4082ee2cd9b722e3.tar.gz
More efficient check for valid class name
Use a bitset of valid characters instead of strspn. This is both more efficient and more compact.
Diffstat (limited to 'Zend/zend_execute_API.c')
-rw-r--r--Zend/zend_execute_API.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 117eea7d66..f1babc3d02 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -910,6 +910,28 @@ ZEND_API void zend_call_known_instance_method_with_2_params(
zend_call_known_instance_method(fn, object, retval_ptr, 2, params);
}
+/* 0-9 a-z A-Z _ \ 0x80-0xff */
+static const uint32_t valid_chars[8] = {
+ 0x00000000,
+ 0x03ff0000,
+ 0x97fffffe,
+ 0x07fffffe,
+ 0xffffffff,
+ 0xffffffff,
+ 0xffffffff,
+ 0xffffffff,
+};
+
+static zend_bool zend_is_valid_class_name(zend_string *name) {
+ for (size_t i = 0; i < ZSTR_LEN(name); i++) {
+ unsigned char c = ZSTR_VAL(name)[i];
+ if (!ZEND_BIT_TEST(valid_chars, c)) {
+ return 0;
+ }
+ }
+ return 1;
+}
+
ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, zend_string *key, uint32_t flags) /* {{{ */
{
zend_class_entry *ce = NULL;
@@ -966,7 +988,7 @@ ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, zend_string *
}
/* Verify class name before passing it to the autoloader. */
- if (!key && strspn(ZSTR_VAL(name), "0123456789_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377\\") != ZSTR_LEN(name)) {
+ if (!key && !zend_is_valid_class_name(name)) {
zend_string_release_ex(lc_name, 0);
return NULL;
}