com php-src: Fixed bug #70963 (Unserialize shows UNKNOW in result): ext/standard/tests/serialize/bug70963.phpt ext/standard/var_u nserializer.c
ext/standard/var_unserializer.re
| From: | Anatol Belski | Date: | Wed, 25 Nov 2015 02:14:34 +0000 |
| Subject: | com php-src: Fixed bug #70963 (Unserialize shows UNKNOW in result): ext/standard/tests/serialize/bug70963.phpt ext/standard/var_u nserializer.c ext/standard/var_unserializer.re |
||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-90011@lists.php.net to get a copy of this message | ||
Commit: aa4747c407e07b8d0b297f44c4ea7835b76fd58d
Author: Xinchen Hui <laruence@gmail.com> Tue, 24 Nov 2015 11:02:24 +0800
Committer: Anatol Belski <ab@php.net> Wed, 25 Nov 2015 03:14:34 +0100
Parents: ea7d6bdc425421c57af1a2bddc56cd49fe7e5520
Branches: PHP-7.0.0
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=aa4747c407e07b8d0b297f44c4ea7835b76fd58d
Log:
Fixed bug #70963 (Unserialize shows UNKNOW in result)
Thanks to ryat for reportinig
Bugs:
https://bugs.php.net/70963
Changed paths:
A ext/standard/tests/serialize/bug70963.phpt
M ext/standard/var_unserializer.c
M ext/standard/var_unserializer.re
Diff:
diff --git a/ext/standard/tests/serialize/bug70963.phpt b/ext/standard/tests/serialize/bug70963.phpt
new file mode 100644
index 0000000..6802d99
--- /dev/null
+++ b/ext/standard/tests/serialize/bug70963.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Bug #70963 (Unserialize shows UNKNOW in result)
+--FILE--
+<?php
+var_dump(unserialize('a:2:{i:0;O:9:"exception":1:{s:16:"'."\0".'Exception'."\0".'trace";s:4:"test";}i:1;R:3;}'));
+?>
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(Exception)#%d (5) {
+ ["message":protected]=>
+ string(0) ""
+ ["string":"Exception":private]=>
+ string(0) ""
+ ["code":protected]=>
+ int(0)
+ ["file":protected]=>
+ string(%d) "%s"
+ ["line":protected]=>
+ int(%d)
+ }
+}
diff --git a/ext/standard/var_unserializer.c b/ext/standard/var_unserializer.c
index 863fc9d..f4c2b32 100644
--- a/ext/standard/var_unserializer.c
+++ b/ext/standard/var_unserializer.c
@@ -565,7 +565,7 @@ yy2:
yych = *(YYMARKER = ++YYCURSOR);
if (yych == ':') goto yy95;
yy3:
-#line 851 "ext/standard/var_unserializer.re"
+#line 857 "ext/standard/var_unserializer.re"
{ return 0; }
#line 571 "ext/standard/var_unserializer.c"
yy4:
@@ -610,7 +610,7 @@ yy13:
goto yy3;
yy14:
++YYCURSOR;
-#line 845 "ext/standard/var_unserializer.re"
+#line 851 "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");
@@ -646,7 +646,7 @@ yy20:
yych = *++YYCURSOR;
if (yych != '"') goto yy18;
++YYCURSOR;
-#line 700 "ext/standard/var_unserializer.re"
+#line 706 "ext/standard/var_unserializer.re"
{
size_t len, len2, len3, maxlen;
zend_long elements;
@@ -816,7 +816,7 @@ yy27:
yych = *++YYCURSOR;
if (yych != '"') goto yy18;
++YYCURSOR;
-#line 693 "ext/standard/var_unserializer.re"
+#line 699 "ext/standard/var_unserializer.re"
{
if (!var_hash) return 0;
@@ -844,7 +844,7 @@ yy34:
yych = *++YYCURSOR;
if (yych != '{') goto yy18;
++YYCURSOR;
-#line 669 "ext/standard/var_unserializer.re"
+#line 675 "ext/standard/var_unserializer.re"
{
zend_long elements = parse_iv(start + 2);
/* use iv() not uiv() in order to check data range */
@@ -889,7 +889,7 @@ yy41:
yych = *++YYCURSOR;
if (yych != '"') goto yy18;
++YYCURSOR;
-#line 641 "ext/standard/var_unserializer.re"
+#line 647 "ext/standard/var_unserializer.re"
{
size_t len, maxlen;
zend_string *str;
@@ -938,7 +938,7 @@ yy48:
yych = *++YYCURSOR;
if (yych != '"') goto yy18;
++YYCURSOR;
-#line 614 "ext/standard/var_unserializer.re"
+#line 620 "ext/standard/var_unserializer.re"
{
size_t len, maxlen;
char *str;
@@ -1053,7 +1053,7 @@ yy61:
}
yy63:
++YYCURSOR;
-#line 605 "ext/standard/var_unserializer.re"
+#line 611 "ext/standard/var_unserializer.re"
{
#if SIZEOF_ZEND_LONG == 4
use_double:
@@ -1121,7 +1121,7 @@ yy73:
yych = *++YYCURSOR;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 589 "ext/standard/var_unserializer.re"
+#line 595 "ext/standard/var_unserializer.re"
{
*p = YYCURSOR;
@@ -1164,7 +1164,7 @@ yy79:
if (yych <= '9') goto yy79;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 563 "ext/standard/var_unserializer.re"
+#line 569 "ext/standard/var_unserializer.re"
{
#if SIZEOF_ZEND_LONG == 4
int digits = YYCURSOR - start - 3;
@@ -1198,7 +1198,7 @@ yy83:
yych = *++YYCURSOR;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 557 "ext/standard/var_unserializer.re"
+#line 563 "ext/standard/var_unserializer.re"
{
*p = YYCURSOR;
ZVAL_BOOL(rval, parse_iv(start + 2));
@@ -1207,7 +1207,7 @@ yy83:
#line 1208 "ext/standard/var_unserializer.c"
yy87:
++YYCURSOR;
-#line 551 "ext/standard/var_unserializer.re"
+#line 557 "ext/standard/var_unserializer.re"
{
*p = YYCURSOR;
ZVAL_NULL(rval);
@@ -1236,7 +1236,7 @@ yy91:
if (yych <= '9') goto yy91;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 535 "ext/standard/var_unserializer.re"
+#line 541 "ext/standard/var_unserializer.re"
{
zend_long id;
@@ -1289,17 +1289,23 @@ yy97:
zval_ptr_dtor(rval);
if (Z_ISREF_P(rval_ref)) {
- ZVAL_COPY(rval, rval_ref);
+ if (!Z_ISUNDEF_P(Z_REFVAL_P(rval_ref))) {
+ ZVAL_COPY(rval, rval_ref);
} else {
- ZVAL_NEW_REF(rval_ref, rval_ref);
- ZVAL_COPY(rval, rval_ref);
+ ZVAL_UNDEF(rval);
+ }
+ } else if (Z_ISUNDEF_P(rval_ref)) {
+ ZVAL_UNDEF(rval);
+ } else {
+ ZVAL_NEW_REF(rval_ref, rval_ref);
+ ZVAL_COPY(rval, rval_ref);
}
return 1;
}
-#line 1301 "ext/standard/var_unserializer.c"
+#line 1307 "ext/standard/var_unserializer.c"
}
-#line 853 "ext/standard/var_unserializer.re"
+#line 859 "ext/standard/var_unserializer.re"
return 0;
diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re
index 77ab31e..0ebca3d 100644
--- a/ext/standard/var_unserializer.re
+++ b/ext/standard/var_unserializer.re
@@ -523,10 +523,16 @@ PHPAPI int php_var_unserialize_ex(UNSERIALIZE_PARAMETER)
zval_ptr_dtor(rval);
if (Z_ISREF_P(rval_ref)) {
- ZVAL_COPY(rval, rval_ref);
+ if (!Z_ISUNDEF_P(Z_REFVAL_P(rval_ref))) {
+ ZVAL_COPY(rval, rval_ref);
+ } else {
+ ZVAL_UNDEF(rval);
+ }
+ } else if (Z_ISUNDEF_P(rval_ref)) {
+ ZVAL_UNDEF(rval);
} else {
- ZVAL_NEW_REF(rval_ref, rval_ref);
- ZVAL_COPY(rval, rval_ref);
+ ZVAL_NEW_REF(rval_ref, rval_ref);
+ ZVAL_COPY(rval, rval_ref);
}
return 1;