diff --git a/ext/dom/document.c b/ext/dom/document.c index 64da4f051be2c..38bb4553a11a1 100644 --- a/ext/dom/document.c +++ b/ext/dom/document.c @@ -2096,6 +2096,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_OBJ(docp, id, xmlDocPtr, 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 0000000000000..24124d712ea09 --- /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