mirror of
https://github.com/php/php-src.git
synced 2024-09-22 18:37:25 +00:00
Fix namespace related problems
This commit is contained in:
parent
135415ca8f
commit
3b2fa8bb96
@ -353,6 +353,7 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
|
|||||||
int len2;
|
int len2;
|
||||||
char *class_name;
|
char *class_name;
|
||||||
zend_class_entry *ce;
|
zend_class_entry *ce;
|
||||||
|
zend_class_entry **pce;
|
||||||
int incomplete_class = 0;
|
int incomplete_class = 0;
|
||||||
|
|
||||||
zval *user_func;
|
zval *user_func;
|
||||||
@ -373,50 +374,60 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
|
|||||||
class_name[len] = class_name[len] - 'A' + 'a';
|
class_name[len] = class_name[len] - 'A' + 'a';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (zend_hash_find(CG(class_table), class_name, len2 + 1, (void **) &ce) != SUCCESS) {
|
do {
|
||||||
|
/* Try to find class directly */
|
||||||
|
if (zend_lookup_ns_class(class_name, len2, &pce TSRMLS_CC) == SUCCESS) {
|
||||||
|
ce = *pce;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check for unserialize callback */
|
||||||
if ((PG(unserialize_callback_func) == NULL) || (PG(unserialize_callback_func)[0] == '\0')) {
|
if ((PG(unserialize_callback_func) == NULL) || (PG(unserialize_callback_func)[0] == '\0')) {
|
||||||
incomplete_class = 1;
|
incomplete_class = 1;
|
||||||
ce = PHP_IC_ENTRY;
|
ce = PHP_IC_ENTRY;
|
||||||
} else {
|
break;
|
||||||
MAKE_STD_ZVAL(user_func);
|
}
|
||||||
ZVAL_STRING(user_func, PG(unserialize_callback_func), 1);
|
|
||||||
|
/* Call unserialize callback */
|
||||||
args[0] = &arg_func_name;
|
MAKE_STD_ZVAL(user_func);
|
||||||
MAKE_STD_ZVAL(arg_func_name);
|
ZVAL_STRING(user_func, PG(unserialize_callback_func), 1);
|
||||||
ZVAL_STRING(arg_func_name, class_name, 1);
|
args[0] = &arg_func_name;
|
||||||
|
MAKE_STD_ZVAL(arg_func_name);
|
||||||
if (call_user_function_ex(CG(function_table), NULL, user_func, &retval_ptr, 1, args, 0, NULL TSRMLS_CC) != SUCCESS) {
|
ZVAL_STRING(arg_func_name, class_name, 1);
|
||||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "defined (%s) but not found", user_func->value.str.val);
|
if (call_user_function_ex(CG(function_table), NULL, user_func, &retval_ptr, 1, args, 0, NULL TSRMLS_CC) != SUCCESS) {
|
||||||
incomplete_class = 1;
|
php_error_docref(NULL TSRMLS_CC, E_WARNING, "defined (%s) but not found", user_func->value.str.val);
|
||||||
ce = PHP_IC_ENTRY;
|
incomplete_class = 1;
|
||||||
} else {
|
ce = PHP_IC_ENTRY;
|
||||||
if (zend_hash_find(CG(class_table), class_name, len2 + 1, (void **) &ce) != SUCCESS) {
|
zval_ptr_dtor(&user_func);
|
||||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "(%s) hasn't defined the class it was called for", user_func->value.str.val);
|
zval_ptr_dtor(&arg_func_name);
|
||||||
incomplete_class = 1;
|
break;
|
||||||
ce = PHP_IC_ENTRY;
|
}
|
||||||
} else {
|
if (retval_ptr) {
|
||||||
#ifdef ZEND_ENGINE_2
|
zval_ptr_dtor(&retval_ptr);
|
||||||
ce = *(zend_class_entry **)ce; /* Bad hack, TBF! */
|
}
|
||||||
#endif
|
|
||||||
efree(class_name);
|
/* The callback function may have defined the class */
|
||||||
}
|
if (zend_lookup_ns_class(class_name, len2, &pce TSRMLS_CC) == SUCCESS) {
|
||||||
}
|
ce = *pce;
|
||||||
|
} else {
|
||||||
|
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Function %s() hasn't defined the class it was called for", user_func->value.str.val);
|
||||||
|
incomplete_class = 1;
|
||||||
|
ce = PHP_IC_ENTRY;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
#ifdef ZEND_ENGINE_2
|
|
||||||
ce = *(zend_class_entry **)ce; /* Bad hack, TBF! */
|
|
||||||
#endif
|
|
||||||
efree(class_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
zval_ptr_dtor(&user_func);
|
||||||
|
zval_ptr_dtor(&arg_func_name);
|
||||||
|
break;
|
||||||
|
} while (1);
|
||||||
|
|
||||||
*p = YYCURSOR;
|
*p = YYCURSOR;
|
||||||
elements = object_common1(UNSERIALIZE_PASSTHRU, ce);
|
elements = object_common1(UNSERIALIZE_PASSTHRU, ce);
|
||||||
|
|
||||||
if (incomplete_class) {
|
if (incomplete_class) {
|
||||||
php_store_class_name(*rval, class_name, len2);
|
php_store_class_name(*rval, class_name, len2);
|
||||||
efree(class_name);
|
|
||||||
}
|
}
|
||||||
|
efree(class_name);
|
||||||
|
|
||||||
return object_common2(UNSERIALIZE_PASSTHRU, elements);
|
return object_common2(UNSERIALIZE_PASSTHRU, elements);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user