summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_execute.c1
-rw-r--r--ext/standard/tests/serialize/overwrite_untyped_ref.phpt17
-rw-r--r--ext/standard/var_unserializer.re2
3 files changed, 19 insertions, 1 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index fb35b8a116..cb6e63c515 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -3262,6 +3262,7 @@ ZEND_API void ZEND_FASTCALL zend_ref_del_type_source(zend_property_info_source_l
zend_property_info_list *list = ZEND_PROPERTY_INFO_SOURCE_TO_LIST(source_list->list);
zend_property_info **ptr, **end;
+ ZEND_ASSERT(prop);
if (!ZEND_PROPERTY_INFO_SOURCE_IS_LIST(source_list->list)) {
ZEND_ASSERT(source_list->ptr == prop);
source_list->ptr = NULL;
diff --git a/ext/standard/tests/serialize/overwrite_untyped_ref.phpt b/ext/standard/tests/serialize/overwrite_untyped_ref.phpt
new file mode 100644
index 0000000000..d6f3b78bfb
--- /dev/null
+++ b/ext/standard/tests/serialize/overwrite_untyped_ref.phpt
@@ -0,0 +1,17 @@
+--TEST--
+Overwrite reference in untyped property
+--FILE--
+<?php
+class Test {
+ public $prop;
+}
+$s = <<<'STR'
+O:4:"Test":2:{s:4:"prop";R:1;s:4:"prop";i:0;}
+STR;
+var_dump(unserialize($s));
+?>
+--EXPECT--
+object(Test)#1 (1) {
+ ["prop"]=>
+ int(0)
+}
diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re
index 04f02cd762..1c787034dd 100644
--- a/ext/standard/var_unserializer.re
+++ b/ext/standard/var_unserializer.re
@@ -556,7 +556,7 @@ string_key:
/* This is a property with a declaration */
old_data = Z_INDIRECT_P(old_data);
info = zend_get_typed_property_info_for_slot(obj, old_data);
- if (Z_ISREF_P(old_data)) {
+ if (info && Z_ISREF_P(old_data)) {
/* If the value is overwritten, remove old type source from ref. */
ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(old_data), info);
}