/* {{{ proto Exception::__wakeup()
Exception unserialize checks */
#define CHECK_EXC_TYPE(name, type) \
- if(zend_read_property(i_get_exception_base(object), (object), name, sizeof(name) - 1, 1, &value) != &EG(uninitialized_zval) \
- && Z_TYPE(value) != type) { \
+ ZVAL_UNDEF(&value); \
+ pvalue = zend_read_property(i_get_exception_base(object), (object), name, sizeof(name) - 1, 1, &value); \
+ if(Z_TYPE_P(pvalue) != IS_UNDEF && Z_TYPE_P(pvalue) != type) { \
zval tmp; \
ZVAL_STRINGL(&tmp, name, sizeof(name) - 1); \
Z_OBJ_HANDLER_P(object, unset_property)(object, &tmp, NULL); \
ZEND_METHOD(exception, __wakeup)
{
- zval value;
+ zval value, *pvalue;
zval *object = getThis();
CHECK_EXC_TYPE("message", IS_STRING);
CHECK_EXC_TYPE("string", IS_STRING);
exception = getThis();
ZVAL_STRINGL(&fname, "gettraceasstring", sizeof("gettraceasstring")-1);
- while (exception && Z_TYPE_P(exception) == IS_OBJECT) {
+ while (exception && Z_TYPE_P(exception) == IS_OBJECT && instanceof_function(Z_OBJCE_P(exception), zend_ce_throwable)) {
zend_string *prev_str = str;
zend_string *message = zval_get_string(GET_PROPERTY(exception, "message"));
zend_string *file = zval_get_string(GET_PROPERTY(exception, "file"));
--EXPECTF--
object(DateInterval)#%d (15) {
["y"]=>
- int(-1)
+ int(2)
["m"]=>
- int(-1)
+ int(0)
["d"]=>
- int(-1)
+ int(0)
["h"]=>
- int(-1)
+ int(6)
["i"]=>
- int(-1)
+ int(8)
["s"]=>
- int(-1)
+ int(0)
["weekday"]=>
int(10)
["weekday_behavior"]=>
size_t buf_len;
const unsigned char *p, *s;
php_unserialize_data_t var_hash;
- zval members, zflags;
+ zval *members, *zflags;
HashTable *aht;
zend_long flags;
}
++p;
- if (!php_var_unserialize(&zflags, &p, s + buf_len, &var_hash) || Z_TYPE(zflags) != IS_LONG) {
+ zflags = var_tmp_var(&var_hash);
+ if (!php_var_unserialize(zflags, &p, s + buf_len, &var_hash) || Z_TYPE_P(zflags) != IS_LONG) {
goto outexcept;
}
- var_push_dtor(&var_hash, &zflags);
--p; /* for ';' */
- flags = Z_LVAL(zflags);
+ flags = Z_LVAL_P(zflags);
/* flags needs to be verified and we also need to verify whether the next
- * thing we get is ';'. After that we require an 'm' or somethign else
+ * thing we get is ';'. After that we require an 'm' or something else
* where 'm' stands for members and anything else should be an array. If
* neither 'a' or 'm' follows we have an error. */
}
++p;
- ZVAL_UNDEF(&members);
- if (!php_var_unserialize(&members, &p, s + buf_len, &var_hash) || Z_TYPE(members) != IS_ARRAY) {
- zval_ptr_dtor(&members);
+ members = var_tmp_var(&var_hash);
+ if (!php_var_unserialize(members, &p, s + buf_len, &var_hash) || Z_TYPE_P(members) != IS_ARRAY) {
goto outexcept;
}
- var_push_dtor(&var_hash, &members);
/* copy members */
- object_properties_load(&intern->std, Z_ARRVAL(members));
- zval_ptr_dtor(&members);
+ object_properties_load(&intern->std, Z_ARRVAL_P(members));
/* done reading $serialized */
-
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
return;
SPL_METHOD(SplDoublyLinkedList, unserialize)
{
spl_dllist_object *intern = Z_SPLDLLIST_P(getThis());
- zval flags, elem;
+ zval *flags, *elem;
char *buf;
size_t buf_len;
const unsigned char *p, *s;
PHP_VAR_UNSERIALIZE_INIT(var_hash);
/* flags */
- if (!php_var_unserialize(&flags, &p, s + buf_len, &var_hash)) {
+ flags = var_tmp_var(&var_hash);
+ if (!php_var_unserialize(flags, &p, s + buf_len, &var_hash) || Z_TYPE_P(flags) != IS_LONG) {
goto error;
}
- if (Z_TYPE(flags) != IS_LONG) {
- zval_ptr_dtor(&flags);
- goto error;
- }
-
- intern->flags = (int)Z_LVAL(flags);
- zval_ptr_dtor(&flags);
+ intern->flags = (int)Z_LVAL_P(flags);
/* elements */
while(*p == ':') {
++p;
- if (!php_var_unserialize(&elem, &p, s + buf_len, &var_hash)) {
+ elem = var_tmp_var(&var_hash);
+ if (!php_var_unserialize(elem, &p, s + buf_len, &var_hash)) {
goto error;
}
- spl_ptr_llist_push(intern->llist, &elem);
- zval_ptr_dtor(&elem);
+ spl_ptr_llist_push(intern->llist, elem);
}
if (*p != '\0') {
size_t buf_len;
const unsigned char *p, *s;
php_unserialize_data_t var_hash;
- zval entry, pmembers, pcount, inf;
+ zval entry, inf;
+ zval *pcount, *pmembers;
spl_SplObjectStorageElement *element;
zend_long count;
}
++p;
- if (!php_var_unserialize(&pcount, &p, s + buf_len, &var_hash)) {
- goto outexcept;
- }
- if (Z_TYPE(pcount) != IS_LONG) {
- zval_ptr_dtor(&pcount);
+ pcount = var_tmp_var(&var_hash);
+ if (!php_var_unserialize(pcount, &p, s + buf_len, &var_hash) || Z_TYPE_P(pcount) != IS_LONG) {
goto outexcept;
}
- var_push_dtor(&var_hash, &pcount);
--p; /* for ';' */
- count = Z_LVAL(pcount);
+ count = Z_LVAL_P(pcount);
while (count-- > 0) {
spl_SplObjectStorageElement *pelement;
if(*p != 'O' && *p != 'C' && *p != 'r') {
goto outexcept;
}
- /* sore reference to allow cross-references between different elements */
+ /* store reference to allow cross-references between different elements */
if (!php_var_unserialize(&entry, &p, s + buf_len, &var_hash)) {
goto outexcept;
}
zval_ptr_dtor(&entry);
goto outexcept;
}
+ } else {
+ ZVAL_UNDEF(&inf);
}
hash = spl_object_storage_get_hash(intern, getThis(), &entry);
var_push_dtor(&var_hash, &pelement->obj);
}
}
- element = spl_object_storage_attach(intern, getThis(), &entry, &inf);
+ element = spl_object_storage_attach(intern, getThis(), &entry, Z_ISUNDEF(inf)?NULL:&inf);
var_replace(&var_hash, &entry, &element->obj);
var_replace(&var_hash, &inf, &element->inf);
zval_ptr_dtor(&entry);
}
++p;
- ZVAL_UNDEF(&pmembers);
- if (!php_var_unserialize(&pmembers, &p, s + buf_len, &var_hash) || Z_TYPE(pmembers) != IS_ARRAY) {
- zval_ptr_dtor(&pmembers);
+ pmembers = var_tmp_var(&var_hash);
+ if (!php_var_unserialize(pmembers, &p, s + buf_len, &var_hash) || Z_TYPE_P(pmembers) != IS_ARRAY) {
goto outexcept;
}
- var_push_dtor(&var_hash, &pmembers);
/* copy members */
if (!intern->std.properties) {
rebuild_object_properties(&intern->std);
}
- zend_hash_copy(intern->std.properties, Z_ARRVAL(pmembers), (copy_ctor_func_t) zval_add_ref);
- zval_ptr_dtor(&pmembers);
+ zend_hash_copy(intern->std.properties, Z_ARRVAL_P(pmembers), (copy_ctor_func_t) zval_add_ref);
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
return;
PHPAPI void var_replace(php_unserialize_data_t *var_hash, zval *ozval, zval *nzval);
PHPAPI void var_push_dtor(php_unserialize_data_t *var_hash, zval *val);
-PHPAPI void var_push_dtor_no_addref(php_unserialize_data_t *var_hashx, zval *rval);
+PHPAPI zval *var_tmp_var(php_unserialize_data_t *var_hashx);
PHPAPI void var_destroy(php_unserialize_data_t *var_hash);
#endif /* PHP_VAR_H */
Notice: Undefined property: Exception::$file in %s/bug69793.php on line %d
Notice: Undefined property: Exception::$previous in %s/bug69793.php on line %d
-string(53) "exception 'Exception' in :1337
+string(41) "Exception in :1337
Stack trace:
#0 {main}"
-/* Generated by re2c 0.13.5 */
+/* Generated by re2c 0.13.7.5 */
#line 1 "ext/standard/var_unserializer.re"
/*
+----------------------------------------------------------------------+
PHPAPI void var_push_dtor(php_unserialize_data_t *var_hashx, zval *rval)
{
- var_dtor_entries *var_hash;
-
- if (!var_hashx || !*var_hashx) {
- return;
- }
-
- var_hash = (*var_hashx)->last_dtor;
-#if VAR_ENTRIES_DBG
- fprintf(stderr, "var_push_dtor(%ld): %d\n", var_hash?var_hash->used_slots:-1L, Z_TYPE_PP(rval));
-#endif
-
- if (!var_hash || var_hash->used_slots == VAR_ENTRIES_MAX) {
- var_hash = emalloc(sizeof(var_dtor_entries));
- var_hash->used_slots = 0;
- var_hash->next = 0;
-
- if (!(*var_hashx)->first_dtor) {
- (*var_hashx)->first_dtor = var_hash;
- } else {
- ((var_dtor_entries *) (*var_hashx)->last_dtor)->next = var_hash;
- }
-
- (*var_hashx)->last_dtor = var_hash;
- }
+ zval *tmp_var = var_tmp_var(var_hashx);
+ if (!tmp_var) {
+ return;
+ }
+ ZVAL_COPY(tmp_var, rval);
+}
- ZVAL_COPY(&var_hash->data[var_hash->used_slots], rval);
- var_hash->used_slots++;
+PHPAPI zval *var_tmp_var(php_unserialize_data_t *var_hashx)
+{
+ var_dtor_entries *var_hash;
+
+ if (!var_hashx || !*var_hashx) {
+ return NULL;
+ }
+
+ var_hash = (*var_hashx)->last_dtor;
+ if (!var_hash || var_hash->used_slots == VAR_ENTRIES_MAX) {
+ var_hash = emalloc(sizeof(var_dtor_entries));
+ var_hash->used_slots = 0;
+ var_hash->next = 0;
+
+ if (!(*var_hashx)->first_dtor) {
+ (*var_hashx)->first_dtor = var_hash;
+ } else {
+ ((var_dtor_entries *) (*var_hashx)->last_dtor)->next = var_hash;
+ }
+
+ (*var_hashx)->last_dtor = var_hash;
+ }
+ ZVAL_UNDEF(&var_hash->data[var_hash->used_slots]);
+ return &var_hash->data[var_hash->used_slots++];
}
//???
#define YYMARKER marker
-#line 267 "ext/standard/var_unserializer.re"
+#line 271 "ext/standard/var_unserializer.re"
start = cursor;
-#line 528 "ext/standard/var_unserializer.c"
+#line 532 "ext/standard/var_unserializer.c"
{
YYCTYPE yych;
static const unsigned char yybm[] = {
yych = *(YYMARKER = ++YYCURSOR);
if (yych == ':') goto yy95;
yy3:
-#line 875 "ext/standard/var_unserializer.re"
+#line 879 "ext/standard/var_unserializer.re"
{ return 0; }
-#line 590 "ext/standard/var_unserializer.c"
+#line 594 "ext/standard/var_unserializer.c"
yy4:
yych = *(YYMARKER = ++YYCURSOR);
if (yych == ':') goto yy89;
goto yy3;
yy14:
++YYCURSOR;
-#line 869 "ext/standard/var_unserializer.re"
+#line 873 "ext/standard/var_unserializer.re"
{
/* this is the case where we have less data than planned */
php_error_docref(NULL, E_NOTICE, "Unexpected end of serialized data");
return 0; /* not sure if it should be 0 or 1 here? */
}
-#line 639 "ext/standard/var_unserializer.c"
+#line 643 "ext/standard/var_unserializer.c"
yy16:
yych = *++YYCURSOR;
goto yy3;
if (yybm[0+yych] & 128) {
goto yy20;
}
- if (yych != ':') goto yy18;
+ if (yych <= '/') goto yy18;
+ if (yych >= ';') goto yy18;
yych = *++YYCURSOR;
if (yych != '"') goto yy18;
++YYCURSOR;
-#line 724 "ext/standard/var_unserializer.re"
+#line 728 "ext/standard/var_unserializer.re"
{
size_t len, len2, len3, maxlen;
zend_long elements;
return object_common2(UNSERIALIZE_PASSTHRU, elements);
}
-#line 814 "ext/standard/var_unserializer.c"
+#line 819 "ext/standard/var_unserializer.c"
yy25:
yych = *++YYCURSOR;
if (yych <= ',') {
yych = *++YYCURSOR;
if (yych != '"') goto yy18;
++YYCURSOR;
-#line 716 "ext/standard/var_unserializer.re"
+#line 720 "ext/standard/var_unserializer.re"
{
//??? INIT_PZVAL(rval);
return object_common2(UNSERIALIZE_PASSTHRU,
object_common1(UNSERIALIZE_PASSTHRU, ZEND_STANDARD_CLASS_DEF_PTR));
}
-#line 847 "ext/standard/var_unserializer.c"
+#line 852 "ext/standard/var_unserializer.c"
yy32:
yych = *++YYCURSOR;
if (yych == '+') goto yy33;
yych = *++YYCURSOR;
if (yych != '{') goto yy18;
++YYCURSOR;
-#line 695 "ext/standard/var_unserializer.re"
+#line 699 "ext/standard/var_unserializer.re"
{
zend_long elements = parse_iv(start + 2);
/* use iv() not uiv() in order to check data range */
return finish_nested_data(UNSERIALIZE_PASSTHRU);
}
-#line 889 "ext/standard/var_unserializer.c"
+#line 894 "ext/standard/var_unserializer.c"
yy39:
yych = *++YYCURSOR;
if (yych == '+') goto yy40;
yych = *++YYCURSOR;
if (yych != '"') goto yy18;
++YYCURSOR;
-#line 667 "ext/standard/var_unserializer.re"
+#line 671 "ext/standard/var_unserializer.re"
{
size_t len, maxlen;
zend_string *str;
ZVAL_STR(rval, str);
return 1;
}
-#line 938 "ext/standard/var_unserializer.c"
+#line 943 "ext/standard/var_unserializer.c"
yy46:
yych = *++YYCURSOR;
if (yych == '+') goto yy47;
yych = *++YYCURSOR;
if (yych != '"') goto yy18;
++YYCURSOR;
-#line 640 "ext/standard/var_unserializer.re"
+#line 644 "ext/standard/var_unserializer.re"
{
size_t len, maxlen;
char *str;
ZVAL_STRINGL(rval, str, len);
return 1;
}
-#line 986 "ext/standard/var_unserializer.c"
+#line 991 "ext/standard/var_unserializer.c"
yy53:
yych = *++YYCURSOR;
if (yych <= '/') {
}
yy63:
++YYCURSOR;
-#line 631 "ext/standard/var_unserializer.re"
+#line 635 "ext/standard/var_unserializer.re"
{
#if SIZEOF_ZEND_LONG == 4
use_double:
ZVAL_DOUBLE(rval, zend_strtod((const char *)start + 2, NULL));
return 1;
}
-#line 1083 "ext/standard/var_unserializer.c"
+#line 1088 "ext/standard/var_unserializer.c"
yy65:
yych = *++YYCURSOR;
if (yych <= ',') {
yych = *++YYCURSOR;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 615 "ext/standard/var_unserializer.re"
+#line 619 "ext/standard/var_unserializer.re"
{
*p = YYCURSOR;
return 1;
}
-#line 1158 "ext/standard/var_unserializer.c"
+#line 1163 "ext/standard/var_unserializer.c"
yy76:
yych = *++YYCURSOR;
if (yych == 'N') goto yy73;
if (yych <= '9') goto yy79;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 589 "ext/standard/var_unserializer.re"
+#line 593 "ext/standard/var_unserializer.re"
{
#if SIZEOF_ZEND_LONG == 4
int digits = YYCURSOR - start - 3;
ZVAL_LONG(rval, parse_iv(start + 2));
return 1;
}
-#line 1211 "ext/standard/var_unserializer.c"
+#line 1216 "ext/standard/var_unserializer.c"
yy83:
yych = *++YYCURSOR;
if (yych <= '/') goto yy18;
yych = *++YYCURSOR;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 583 "ext/standard/var_unserializer.re"
+#line 587 "ext/standard/var_unserializer.re"
{
*p = YYCURSOR;
ZVAL_BOOL(rval, parse_iv(start + 2));
return 1;
}
-#line 1225 "ext/standard/var_unserializer.c"
+#line 1230 "ext/standard/var_unserializer.c"
yy87:
++YYCURSOR;
-#line 577 "ext/standard/var_unserializer.re"
+#line 581 "ext/standard/var_unserializer.re"
{
*p = YYCURSOR;
ZVAL_NULL(rval);
return 1;
}
-#line 1234 "ext/standard/var_unserializer.c"
+#line 1239 "ext/standard/var_unserializer.c"
yy89:
yych = *++YYCURSOR;
if (yych <= ',') {
if (yych <= '9') goto yy91;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 554 "ext/standard/var_unserializer.re"
+#line 558 "ext/standard/var_unserializer.re"
{
zend_long id;
return 1;
}
-#line 1280 "ext/standard/var_unserializer.c"
+#line 1285 "ext/standard/var_unserializer.c"
yy95:
yych = *++YYCURSOR;
if (yych <= ',') {
if (yych <= '9') goto yy97;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 532 "ext/standard/var_unserializer.re"
+#line 536 "ext/standard/var_unserializer.re"
{
zend_long id;
return 1;
}
-#line 1325 "ext/standard/var_unserializer.c"
+#line 1330 "ext/standard/var_unserializer.c"
}
-#line 877 "ext/standard/var_unserializer.re"
+#line 881 "ext/standard/var_unserializer.re"
return 0;
PHPAPI void var_push_dtor(php_unserialize_data_t *var_hashx, zval *rval)
{
- var_dtor_entries *var_hash;
-
- if (!var_hashx || !*var_hashx) {
- return;
- }
-
- var_hash = (*var_hashx)->last_dtor;
-#if VAR_ENTRIES_DBG
- fprintf(stderr, "var_push_dtor(%ld): %d\n", var_hash?var_hash->used_slots:-1L, Z_TYPE_PP(rval));
-#endif
-
- if (!var_hash || var_hash->used_slots == VAR_ENTRIES_MAX) {
- var_hash = emalloc(sizeof(var_dtor_entries));
- var_hash->used_slots = 0;
- var_hash->next = 0;
-
- if (!(*var_hashx)->first_dtor) {
- (*var_hashx)->first_dtor = var_hash;
- } else {
- ((var_dtor_entries *) (*var_hashx)->last_dtor)->next = var_hash;
- }
-
- (*var_hashx)->last_dtor = var_hash;
- }
+ zval *tmp_var = var_tmp_var(var_hashx);
+ if (!tmp_var) {
+ return;
+ }
+ ZVAL_COPY(tmp_var, rval);
+}
- ZVAL_COPY(&var_hash->data[var_hash->used_slots], rval);
- var_hash->used_slots++;
+PHPAPI zval *var_tmp_var(php_unserialize_data_t *var_hashx)
+{
+ var_dtor_entries *var_hash;
+
+ if (!var_hashx || !*var_hashx) {
+ return NULL;
+ }
+
+ var_hash = (*var_hashx)->last_dtor;
+ if (!var_hash || var_hash->used_slots == VAR_ENTRIES_MAX) {
+ var_hash = emalloc(sizeof(var_dtor_entries));
+ var_hash->used_slots = 0;
+ var_hash->next = 0;
+
+ if (!(*var_hashx)->first_dtor) {
+ (*var_hashx)->first_dtor = var_hash;
+ } else {
+ ((var_dtor_entries *) (*var_hashx)->last_dtor)->next = var_hash;
+ }
+
+ (*var_hashx)->last_dtor = var_hash;
+ }
+ ZVAL_UNDEF(&var_hash->data[var_hash->used_slots]);
+ return &var_hash->data[var_hash->used_slots++];
}
//???