Skip to content

Commit df5011f

Browse files
committed
Export and reuse zend_is_valid_class_name API
Unserialization does the same check as zend_lookup_class, so let's share the same optimized implementation.
1 parent c47011b commit df5011f

File tree

3 files changed

+6
-8
lines changed

3 files changed

+6
-8
lines changed

Zend/zend_execute.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ ZEND_API void zend_init_code_execute_data(zend_execute_data *execute_data, zend_
4343
ZEND_API void zend_execute(zend_op_array *op_array, zval *return_value);
4444
ZEND_API void execute_ex(zend_execute_data *execute_data);
4545
ZEND_API void execute_internal(zend_execute_data *execute_data, zval *return_value);
46+
ZEND_API zend_bool zend_is_valid_class_name(zend_string *name);
4647
ZEND_API zend_class_entry *zend_lookup_class(zend_string *name);
4748
ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, zend_string *lcname, uint32_t flags);
4849
ZEND_API zend_class_entry *zend_get_called_scope(zend_execute_data *ex);

Zend/zend_execute_API.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -991,7 +991,7 @@ static const uint32_t valid_chars[8] = {
991991
0xffffffff,
992992
};
993993

994-
static zend_bool zend_is_valid_class_name(zend_string *name) {
994+
ZEND_API zend_bool zend_is_valid_class_name(zend_string *name) {
995995
for (size_t i = 0; i < ZSTR_LEN(name); i++) {
996996
unsigned char c = ZSTR_VAL(name)[i];
997997
if (!ZEND_BIT_TEST(valid_chars, c)) {

ext/standard/var_unserializer.re

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,7 +1013,7 @@ use_double:
10131013
}
10141014
10151015
object ":" uiv ":" ["] {
1016-
size_t len, len3, maxlen;
1016+
size_t len, maxlen;
10171017
zend_long elements;
10181018
char *str;
10191019
zend_string *class_name;
@@ -1051,15 +1051,12 @@ object ":" uiv ":" ["] {
10511051
return 0;
10521052
}
10531053

1054-
len3 = strspn(str, "0123456789_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\177\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\\");
1055-
if (len3 != len)
1056-
{
1057-
*p = YYCURSOR + len3 - len;
1054+
class_name = zend_string_init(str, len, 0);
1055+
if (!zend_is_valid_class_name(class_name)) {
1056+
zend_string_release_ex(class_name, 0);
10581057
return 0;
10591058
}
10601059

1061-
class_name = zend_string_init(str, len, 0);
1062-
10631060
do {
10641061
if(!unserialize_allowed_class(class_name, var_hash)) {
10651062
incomplete_class = 1;

0 commit comments

Comments
 (0)