diff --git a/NEWS b/NEWS index eccedf5929e..cc1115238e6 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,9 @@ PHP NEWS - Core: . Fixed double-free of non-interned enum case name. (ilutov) +- DOM: + . Fix registerNodeClass with abstract class crashing. (nielsdos) + - Fiber: . Fixed bug GH-11121 (ReflectionFiber segfault). (danog, trowski, bwoebi) diff --git a/ext/dom/document.c b/ext/dom/document.c index 29bc8b8c156..92916f35721 100644 --- a/ext/dom/document.c +++ b/ext/dom/document.c @@ -2072,6 +2072,10 @@ PHP_METHOD(DOMDocument, registerNodeClass) } if (ce == NULL || instanceof_function(ce, basece)) { + if (UNEXPECTED(ce != NULL && (ce->ce_flags & ZEND_ACC_ABSTRACT))) { + zend_argument_value_error(2, "must not be an abstract class"); + RETURN_THROWS(); + } DOM_GET_THIS_INTERN(intern); dom_set_doc_classmap(intern->document, basece, ce); RETURN_TRUE; diff --git a/ext/dom/tests/registerNodeClass_abstract_class.phpt b/ext/dom/tests/registerNodeClass_abstract_class.phpt new file mode 100644 index 00000000000..24124d712ea --- /dev/null +++ b/ext/dom/tests/registerNodeClass_abstract_class.phpt @@ -0,0 +1,24 @@ +--TEST-- +registerNodeClass() with an abstract class should fail +--EXTENSIONS-- +dom +--FILE-- +registerNodeClass("DOMElement", "Test"); +} catch (ValueError $e) { + echo "ValueError: ", $e->getMessage(), "\n"; +} + +$dom->createElement("foo"); + +?> +--EXPECT-- +ValueError: DOMDocument::registerNodeClass(): Argument #2 ($extendedClass) must not be an abstract class