msxml3: Return S_FALSE from IXMLDOMNamedNodeMap::nextNode() when there are no attributes.
Currently Wine return S_FALSE when IXMLDOMNamedNodeMap::nextNode()
has run out of attributes to return, but when an XML node has no
attributes at all, it returns S_OK despite setting the nextNode
output parameter to NULL, causing the caller to crash when it
accesses this pointer. Return S_FALSE in this case instead.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50603
Signed-off-by: Damjan Jovanovic <damjan.jov@gmail.com>
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
(cherry picked from commit 06cd8d3d2e
)
Signed-off-by: Michael Stefaniuc <mstefani@winehq.org>
This commit is contained in:
parent
c7436090e4
commit
66fe6841b8
|
@ -1888,6 +1888,8 @@ static HRESULT domelem_next_node(const xmlNodePtr node, LONG *iter, IXMLDOMNode
|
||||||
*nextNode = NULL;
|
*nextNode = NULL;
|
||||||
|
|
||||||
curr = node->properties;
|
curr = node->properties;
|
||||||
|
if (curr == NULL)
|
||||||
|
return S_FALSE;
|
||||||
|
|
||||||
for (i = 0; i < *iter; i++) {
|
for (i = 0; i < *iter; i++) {
|
||||||
if (curr->next == NULL)
|
if (curr->next == NULL)
|
||||||
|
|
|
@ -2203,6 +2203,8 @@ static void test_domnode( void )
|
||||||
|
|
||||||
if (element)
|
if (element)
|
||||||
{
|
{
|
||||||
|
IXMLDOMNamedNodeMap *attributes;
|
||||||
|
|
||||||
owner = NULL;
|
owner = NULL;
|
||||||
r = IXMLDOMElement_get_ownerDocument( element, &owner );
|
r = IXMLDOMElement_get_ownerDocument( element, &owner );
|
||||||
ok( r == S_OK, "get_ownerDocument return code\n");
|
ok( r == S_OK, "get_ownerDocument return code\n");
|
||||||
|
@ -2281,6 +2283,29 @@ static void test_domnode( void )
|
||||||
ok( map != NULL, "should be attributes\n");
|
ok( map != NULL, "should be attributes\n");
|
||||||
|
|
||||||
EXPECT_CHILDREN(element);
|
EXPECT_CHILDREN(element);
|
||||||
|
|
||||||
|
r = IXMLDOMElement_get_childNodes( element, &list );
|
||||||
|
ok( r == S_OK, "Expected S_OK, ret %08x\n", r );
|
||||||
|
r = IXMLDOMNodeList_nextNode( list, &node ); /* <bs> */
|
||||||
|
ok( r == S_OK, "Expected S_OK, ret %08x\n", r );
|
||||||
|
IXMLDOMNode_Release( node );
|
||||||
|
r = IXMLDOMNodeList_nextNode( list, &node ); /* <pr> */
|
||||||
|
ok( r == S_OK, "Expected S_OK, ret %08x\n", r );
|
||||||
|
IXMLDOMNode_Release( node );
|
||||||
|
r = IXMLDOMNodeList_nextNode( list, &node ); /* <empty> */
|
||||||
|
ok( r == S_OK, "Expected S_OK, ret %08x\n", r );
|
||||||
|
r = IXMLDOMNode_get_attributes( node, &attributes );
|
||||||
|
ok( r == S_OK, "Expected S_OK, ret %08x\n", r );
|
||||||
|
next = (IXMLDOMNode*)0xdeadbeef;
|
||||||
|
r = IXMLDOMNamedNodeMap_nextNode( attributes, &next );
|
||||||
|
ok( r == S_FALSE, "Expected S_FALSE, ret %08x\n", r );
|
||||||
|
ok( next == NULL, "Expected NULL, ret %p\n", next );
|
||||||
|
IXMLDOMNamedNodeMap_Release( attributes );
|
||||||
|
IXMLDOMNode_Release( node );
|
||||||
|
node = NULL;
|
||||||
|
next = NULL;
|
||||||
|
IXMLDOMNodeList_Release( list );
|
||||||
|
list = NULL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ok( FALSE, "no element\n");
|
ok( FALSE, "no element\n");
|
||||||
|
|
Loading…
Reference in New Issue