ulong *var_already;
HashTable *myht;
+ if (EG(exception)) {
+ return;
+ }
+
if (var_hash && php_add_var_hash(var_hash, struc, (void *) &var_already TSRMLS_CC) == FAILURE) {
if (Z_ISREF_P(struc)) {
smart_str_appendl(buf, "R:", 2);
BG(serialize_lock)++;
res = call_user_function_ex(CG(function_table), &struc, &fname, &retval_ptr, 0, 0, 1, NULL TSRMLS_CC);
BG(serialize_lock)--;
+
+ if (EG(exception)) {
+ if (retval_ptr) {
+ zval_ptr_dtor(&retval_ptr);
+ }
+ return;
+ }
- if (res == SUCCESS && !EG(exception)) {
+ if (res == SUCCESS) {
if (retval_ptr) {
if (HASH_OF(retval_ptr)) {
php_var_serialize_class(buf, struc, retval_ptr, var_hash TSRMLS_CC);
php_var_serialize(&buf, struc, &var_hash TSRMLS_CC);
PHP_VAR_SERIALIZE_DESTROY(var_hash);
+ if (EG(exception)) {
+ smart_str_free(&buf);
+ RETURN_FALSE;
+ }
+
if (buf.c) {
RETURN_STRINGL(buf.c, buf.len, 0);
} else {
if (!php_var_unserialize(&return_value, &p, p + buf_len, &var_hash TSRMLS_CC)) {
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
zval_dtor(return_value);
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Error at offset %ld of %d bytes", (long)((char*)p - buf), buf_len);
+ if (!EG(exception)) {
+ php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Error at offset %ld of %d bytes", (long)((char*)p - buf), buf_len);
+ }
RETURN_FALSE;
}
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
-/* Generated by re2c 0.13.5 on Mon Jan 21 11:34:03 2013 */
+/* Generated by re2c 0.13.5 on Sat Mar 9 22:33:09 2013 */
#line 1 "ext/standard/var_unserializer.re"
/*
+----------------------------------------------------------------------+
BG(serialize_lock)--;
}
- if (retval_ptr)
+ if (retval_ptr) {
zval_ptr_dtor(&retval_ptr);
+ }
+
+ if (EG(exception)) {
+ return 0;
+ }
return finish_nested_data(UNSERIALIZE_PASSTHRU);
-#line 431 "ext/standard/var_unserializer.c"
+#line 436 "ext/standard/var_unserializer.c"
{
YYCTYPE yych;
static const unsigned char yybm[] = {
yych = *(YYMARKER = ++YYCURSOR);
if (yych == ':') goto yy95;
yy3:
-#line 759 "ext/standard/var_unserializer.re"
+#line 785 "ext/standard/var_unserializer.re"
{ return 0; }
-#line 493 "ext/standard/var_unserializer.c"
+#line 498 "ext/standard/var_unserializer.c"
yy4:
yych = *(YYMARKER = ++YYCURSOR);
if (yych == ':') goto yy89;
goto yy3;
yy14:
++YYCURSOR;
-#line 753 "ext/standard/var_unserializer.re"
+#line 779 "ext/standard/var_unserializer.re"
{
/* this is the case where we have less data than planned */
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unexpected end of serialized data");
return 0; /* not sure if it should be 0 or 1 here? */
}
-#line 542 "ext/standard/var_unserializer.c"
+#line 547 "ext/standard/var_unserializer.c"
yy16:
yych = *++YYCURSOR;
goto yy3;
yych = *++YYCURSOR;
if (yych != '"') goto yy18;
++YYCURSOR;
-#line 630 "ext/standard/var_unserializer.re"
+#line 635 "ext/standard/var_unserializer.re"
{
size_t len, len2, len3, maxlen;
long elements;
BG(serialize_lock) = 1;
if (zend_lookup_class(class_name, len2, &pce TSRMLS_CC) == SUCCESS) {
BG(serialize_lock) = 0;
+ if (EG(exception)) {
+ efree(class_name);
+ return 0;
+ }
ce = *pce;
break;
}
BG(serialize_lock) = 0;
+
+ if (EG(exception)) {
+ efree(class_name);
+ return 0;
+ }
/* Check for unserialize callback */
if ((PG(unserialize_callback_func) == NULL) || (PG(unserialize_callback_func)[0] == '\0')) {
BG(serialize_lock) = 1;
if (call_user_function_ex(CG(function_table), NULL, user_func, &retval_ptr, 1, args, 0, NULL TSRMLS_CC) != SUCCESS) {
BG(serialize_lock) = 0;
+ if (EG(exception)) {
+ efree(class_name);
+ zval_ptr_dtor(&user_func);
+ zval_ptr_dtor(&arg_func_name);
+ return 0;
+ }
php_error_docref(NULL TSRMLS_CC, E_WARNING, "defined (%s) but not found", user_func->value.str.val);
incomplete_class = 1;
ce = PHP_IC_ENTRY;
if (retval_ptr) {
zval_ptr_dtor(&retval_ptr);
}
+ if (EG(exception)) {
+ efree(class_name);
+ zval_ptr_dtor(&user_func);
+ zval_ptr_dtor(&arg_func_name);
+ return 0;
+ }
/* The callback function may have defined the class */
if (zend_lookup_class(class_name, len2, &pce TSRMLS_CC) == SUCCESS) {
return object_common2(UNSERIALIZE_PASSTHRU, elements);
}
-#line 695 "ext/standard/var_unserializer.c"
+#line 721 "ext/standard/var_unserializer.c"
yy25:
yych = *++YYCURSOR;
if (yych <= ',') {
yych = *++YYCURSOR;
if (yych != '"') goto yy18;
++YYCURSOR;
-#line 622 "ext/standard/var_unserializer.re"
+#line 627 "ext/standard/var_unserializer.re"
{
INIT_PZVAL(*rval);
return object_common2(UNSERIALIZE_PASSTHRU,
object_common1(UNSERIALIZE_PASSTHRU, ZEND_STANDARD_CLASS_DEF_PTR));
}
-#line 728 "ext/standard/var_unserializer.c"
+#line 754 "ext/standard/var_unserializer.c"
yy32:
yych = *++YYCURSOR;
if (yych == '+') goto yy33;
yych = *++YYCURSOR;
if (yych != '{') goto yy18;
++YYCURSOR;
-#line 602 "ext/standard/var_unserializer.re"
+#line 607 "ext/standard/var_unserializer.re"
{
long elements = parse_iv(start + 2);
/* use iv() not uiv() in order to check data range */
return finish_nested_data(UNSERIALIZE_PASSTHRU);
}
-#line 769 "ext/standard/var_unserializer.c"
+#line 795 "ext/standard/var_unserializer.c"
yy39:
yych = *++YYCURSOR;
if (yych == '+') goto yy40;
yych = *++YYCURSOR;
if (yych != '"') goto yy18;
++YYCURSOR;
-#line 573 "ext/standard/var_unserializer.re"
+#line 578 "ext/standard/var_unserializer.re"
{
size_t len, maxlen;
char *str;
ZVAL_STRINGL(*rval, str, len, 0);
return 1;
}
-#line 819 "ext/standard/var_unserializer.c"
+#line 845 "ext/standard/var_unserializer.c"
yy46:
yych = *++YYCURSOR;
if (yych == '+') goto yy47;
yych = *++YYCURSOR;
if (yych != '"') goto yy18;
++YYCURSOR;
-#line 545 "ext/standard/var_unserializer.re"
+#line 550 "ext/standard/var_unserializer.re"
{
size_t len, maxlen;
char *str;
ZVAL_STRINGL(*rval, str, len, 1);
return 1;
}
-#line 868 "ext/standard/var_unserializer.c"
+#line 894 "ext/standard/var_unserializer.c"
yy53:
yych = *++YYCURSOR;
if (yych <= '/') {
}
yy63:
++YYCURSOR;
-#line 535 "ext/standard/var_unserializer.re"
+#line 540 "ext/standard/var_unserializer.re"
{
#if SIZEOF_LONG == 4
use_double:
ZVAL_DOUBLE(*rval, zend_strtod((const char *)start + 2, NULL));
return 1;
}
-#line 966 "ext/standard/var_unserializer.c"
+#line 992 "ext/standard/var_unserializer.c"
yy65:
yych = *++YYCURSOR;
if (yych <= ',') {
yych = *++YYCURSOR;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 520 "ext/standard/var_unserializer.re"
+#line 525 "ext/standard/var_unserializer.re"
{
*p = YYCURSOR;
INIT_PZVAL(*rval);
return 1;
}
-#line 1040 "ext/standard/var_unserializer.c"
+#line 1066 "ext/standard/var_unserializer.c"
yy76:
yych = *++YYCURSOR;
if (yych == 'N') goto yy73;
if (yych <= '9') goto yy79;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 493 "ext/standard/var_unserializer.re"
+#line 498 "ext/standard/var_unserializer.re"
{
#if SIZEOF_LONG == 4
int digits = YYCURSOR - start - 3;
ZVAL_LONG(*rval, parse_iv(start + 2));
return 1;
}
-#line 1094 "ext/standard/var_unserializer.c"
+#line 1120 "ext/standard/var_unserializer.c"
yy83:
yych = *++YYCURSOR;
if (yych <= '/') goto yy18;
yych = *++YYCURSOR;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 486 "ext/standard/var_unserializer.re"
+#line 491 "ext/standard/var_unserializer.re"
{
*p = YYCURSOR;
INIT_PZVAL(*rval);
ZVAL_BOOL(*rval, parse_iv(start + 2));
return 1;
}
-#line 1109 "ext/standard/var_unserializer.c"
+#line 1135 "ext/standard/var_unserializer.c"
yy87:
++YYCURSOR;
-#line 479 "ext/standard/var_unserializer.re"
+#line 484 "ext/standard/var_unserializer.re"
{
*p = YYCURSOR;
INIT_PZVAL(*rval);
ZVAL_NULL(*rval);
return 1;
}
-#line 1119 "ext/standard/var_unserializer.c"
+#line 1145 "ext/standard/var_unserializer.c"
yy89:
yych = *++YYCURSOR;
if (yych <= ',') {
if (yych <= '9') goto yy91;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 456 "ext/standard/var_unserializer.re"
+#line 461 "ext/standard/var_unserializer.re"
{
long id;
return 1;
}
-#line 1165 "ext/standard/var_unserializer.c"
+#line 1191 "ext/standard/var_unserializer.c"
yy95:
yych = *++YYCURSOR;
if (yych <= ',') {
if (yych <= '9') goto yy97;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 435 "ext/standard/var_unserializer.re"
+#line 440 "ext/standard/var_unserializer.re"
{
long id;
return 1;
}
-#line 1209 "ext/standard/var_unserializer.c"
+#line 1235 "ext/standard/var_unserializer.c"
}
-#line 761 "ext/standard/var_unserializer.re"
+#line 787 "ext/standard/var_unserializer.re"
return 0;