@@ -218,6 +218,33 @@ ZEND_METHOD(exception, __construct)
218
218
}
219
219
/* }}} */
220
220
221
+ /* {{{ proto Exception::__wakeup()
222
+ Exception unserialize checks */
223
+ #define CHECK_EXC_TYPE (name , type ) \
224
+ value = zend_read_property(default_exception_ce, object, name, sizeof(name)-1, 0 TSRMLS_CC); \
225
+ if(value && Z_TYPE_P(value) != type) { \
226
+ zval *tmp; \
227
+ MAKE_STD_ZVAL(tmp); \
228
+ ZVAL_STRINGL(tmp, name, sizeof(name)-1, 1); \
229
+ Z_OBJ_HANDLER_P(object, unset_property)(object, tmp, 0 TSRMLS_CC); \
230
+ zval_ptr_dtor(&tmp); \
231
+ }
232
+
233
+ ZEND_METHOD (exception , __wakeup )
234
+ {
235
+ zval * value ;
236
+ zval * object = getThis ();
237
+ HashTable * intern_ht = zend_std_get_properties (getThis () TSRMLS_CC );
238
+ CHECK_EXC_TYPE ("message" , IS_STRING );
239
+ CHECK_EXC_TYPE ("string" , IS_STRING );
240
+ CHECK_EXC_TYPE ("code" , IS_LONG );
241
+ CHECK_EXC_TYPE ("file" , IS_STRING );
242
+ CHECK_EXC_TYPE ("line" , IS_LONG );
243
+ CHECK_EXC_TYPE ("trace" , IS_ARRAY );
244
+ CHECK_EXC_TYPE ("previous" , IS_OBJECT );
245
+ }
246
+ /* }}} */
247
+
221
248
/* {{{ proto ErrorException::__construct(string message, int code, int severity [, string filename [, int lineno [, Exception previous]]])
222
249
ErrorException constructor */
223
250
ZEND_METHOD (error_exception , __construct )
@@ -728,6 +755,7 @@ ZEND_END_ARG_INFO()
728
755
const static zend_function_entry default_exception_functions [] = {
729
756
ZEND_ME (exception , __clone , NULL , ZEND_ACC_PRIVATE |ZEND_ACC_FINAL )
730
757
ZEND_ME (exception , __construct , arginfo_exception___construct , ZEND_ACC_PUBLIC )
758
+ ZEND_ME (exception , __wakeup , NULL , ZEND_ACC_PUBLIC |ZEND_ACC_FINAL )
731
759
ZEND_ME (exception , getMessage , NULL , ZEND_ACC_PUBLIC |ZEND_ACC_FINAL )
732
760
ZEND_ME (exception , getCode , NULL , ZEND_ACC_PUBLIC |ZEND_ACC_FINAL )
733
761
ZEND_ME (exception , getFile , NULL , ZEND_ACC_PUBLIC |ZEND_ACC_FINAL )
0 commit comments