]> granicus.if.org Git - php/commitdiff
Fix segfault when unserializing abstract class
authorNikita Popov <nikita.ppv@gmail.com>
Mon, 16 Sep 2019 11:52:52 +0000 (13:52 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Mon, 16 Sep 2019 11:52:52 +0000 (13:52 +0200)
ext/standard/tests/serialize/unserialize_abstract_class.phpt [new file with mode: 0644]
ext/standard/var_unserializer.re

diff --git a/ext/standard/tests/serialize/unserialize_abstract_class.phpt b/ext/standard/tests/serialize/unserialize_abstract_class.phpt
new file mode 100644 (file)
index 0000000..e835e50
--- /dev/null
@@ -0,0 +1,15 @@
+--TEST--
+Unserializing an abstract class should fail
+--FILE--
+<?php
+
+$payload = 'O:23:"RecursiveFilterIterator":0:{}';
+try {
+    var_dump(unserialize($payload));
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+Cannot instantiate abstract class RecursiveFilterIterator
index ba425e692eca49d5da7f01510e534e2f8e17cd39..fcc68dc4312811b7c86e5622cc763b8f3e82b80f 100644 (file)
@@ -1144,7 +1144,11 @@ object ":" uiv ":" ["]   {
                return 0;
        }
 
-       object_init_ex(rval, ce);
+       if (object_init_ex(rval, ce) == FAILURE) {
+               zend_string_release_ex(class_name, 0);
+               return 0;
+       }
+
        if (incomplete_class) {
                php_store_class_name(rval, ZSTR_VAL(class_name), len2);
        }