Jacek Caban : mshtml: Better error handling in create_node calls.
Alexandre Julliard
julliard at winehq.org
Thu Dec 2 12:23:56 CST 2010
Module: wine
Branch: master
Commit: 6bf247f9378c183c922fb0d2742d04189c179cb1
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6bf247f9378c183c922fb0d2742d04189c179cb1
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Dec 1 22:42:03 2010 +0100
mshtml: Better error handling in create_node calls.
---
dlls/mshtml/htmlcomment.c | 11 ++++++--
dlls/mshtml/htmldoc3.c | 5 +++-
dlls/mshtml/htmldoc5.c | 11 ++++++---
dlls/mshtml/htmlnode.c | 49 ++++++++++++++++++++++++++++-------------
dlls/mshtml/htmltextnode.c | 25 +++++++++++++++------
dlls/mshtml/mshtml_private.h | 4 +-
6 files changed, 72 insertions(+), 33 deletions(-)
diff --git a/dlls/mshtml/htmlcomment.c b/dlls/mshtml/htmlcomment.c
index 077a746..49f116d 100644
--- a/dlls/mshtml/htmlcomment.c
+++ b/dlls/mshtml/htmlcomment.c
@@ -185,9 +185,13 @@ static dispex_static_data_t HTMLCommentElement_dispex = {
HTMLCommentElement_iface_tids
};
-HTMLElement *HTMLCommentElement_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode)
+HRESULT HTMLCommentElement_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode, HTMLElement **elem)
{
- HTMLCommentElement *ret = heap_alloc_zero(sizeof(*ret));
+ HTMLCommentElement *ret;
+
+ ret = heap_alloc_zero(sizeof(*ret));
+ if(!ret)
+ return E_OUTOFMEMORY;
ret->element.node.vtbl = &HTMLCommentElementImplVtbl;
ret->lpIHTMLCommentElementVtbl = &HTMLCommentElementVtbl;
@@ -197,5 +201,6 @@ HTMLElement *HTMLCommentElement_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode
nsIDOMNode_AddRef(nsnode);
ret->element.node.nsnode = nsnode;
- return &ret->element;
+ *elem = &ret->element;
+ return S_OK;
}
diff --git a/dlls/mshtml/htmldoc3.c b/dlls/mshtml/htmldoc3.c
index 9a04208..0cab185 100644
--- a/dlls/mshtml/htmldoc3.c
+++ b/dlls/mshtml/htmldoc3.c
@@ -108,6 +108,7 @@ static HRESULT WINAPI HTMLDocument3_createTextNode(IHTMLDocument3 *iface, BSTR t
HTMLDOMNode *node;
nsAString text_str;
nsresult nsres;
+ HRESULT hres;
TRACE("(%p)->(%s %p)\n", This, debugstr_w(text), newTextNode);
@@ -124,8 +125,10 @@ static HRESULT WINAPI HTMLDocument3_createTextNode(IHTMLDocument3 *iface, BSTR t
return E_FAIL;
}
- node = HTMLDOMTextNode_Create(This->doc_node, (nsIDOMNode*)nstext);
+ hres = HTMLDOMTextNode_Create(This->doc_node, (nsIDOMNode*)nstext, &node);
nsIDOMElement_Release(nstext);
+ if(FAILED(hres))
+ return hres;
*newTextNode = HTMLDOMNODE(node);
IHTMLDOMNode_AddRef(HTMLDOMNODE(node));
diff --git a/dlls/mshtml/htmldoc5.c b/dlls/mshtml/htmldoc5.c
index 12742f6..0f8cc7c 100644
--- a/dlls/mshtml/htmldoc5.c
+++ b/dlls/mshtml/htmldoc5.c
@@ -125,9 +125,10 @@ static HRESULT WINAPI HTMLDocument5_createComment(IHTMLDocument5 *iface, BSTR bs
{
HTMLDocument *This = HTMLDOC5_THIS(iface);
nsIDOMComment *nscomment;
- HTMLDOMNode *node;
+ HTMLElement *elem;
nsAString str;
nsresult nsres;
+ HRESULT hres;
TRACE("(%p)->(%s %p)\n", This, debugstr_w(bstrdata), ppRetNode);
@@ -144,11 +145,13 @@ static HRESULT WINAPI HTMLDocument5_createComment(IHTMLDocument5 *iface, BSTR bs
return E_FAIL;
}
- node = &HTMLCommentElement_Create(This->doc_node, (nsIDOMNode*)nscomment)->node;
+ hres = HTMLCommentElement_Create(This->doc_node, (nsIDOMNode*)nscomment, &elem);
nsIDOMElement_Release(nscomment);
+ if(FAILED(hres))
+ return hres;
- *ppRetNode = HTMLDOMNODE(node);
- IHTMLDOMNode_AddRef(HTMLDOMNODE(node));
+ *ppRetNode = HTMLDOMNODE(&elem->node);
+ IHTMLDOMNode_AddRef(HTMLDOMNODE(&elem->node));
return S_OK;
}
diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c
index 0131d5f..aa1f55d 100644
--- a/dlls/mshtml/htmlnode.c
+++ b/dlls/mshtml/htmlnode.c
@@ -33,7 +33,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
static HTMLDOMNode *get_node_obj(HTMLDocumentNode*,IUnknown*);
-static HTMLDOMNode *create_node(HTMLDocumentNode*,nsIDOMNode*);
+static HRESULT create_node(HTMLDocumentNode*,nsIDOMNode*,HTMLDOMNode**);
typedef struct {
DispatchEx dispex;
@@ -962,7 +962,12 @@ void HTMLDOMNode_destructor(HTMLDOMNode *This)
static HRESULT HTMLDOMNode_clone(HTMLDOMNode *This, nsIDOMNode *nsnode, HTMLDOMNode **ret)
{
- *ret = create_node(This->doc, nsnode);
+ HRESULT hres;
+
+ hres = create_node(This->doc, nsnode, ret);
+ if(FAILED(hres))
+ return hres;
+
IHTMLDOMNode_AddRef(HTMLDOMNODE(*ret));
return S_OK;
}
@@ -988,32 +993,45 @@ void HTMLDOMNode_Init(HTMLDocumentNode *doc, HTMLDOMNode *node, nsIDOMNode *nsno
doc->nodes = node;
}
-static HTMLDOMNode *create_node(HTMLDocumentNode *doc, nsIDOMNode *nsnode)
+static HRESULT create_node(HTMLDocumentNode *doc, nsIDOMNode *nsnode, HTMLDOMNode **ret)
{
- HTMLDOMNode *ret;
PRUint16 node_type;
+ HRESULT hres;
nsIDOMNode_GetNodeType(nsnode, &node_type);
switch(node_type) {
case ELEMENT_NODE:
- ret = &HTMLElement_Create(doc, nsnode, FALSE)->node;
+ *ret = &HTMLElement_Create(doc, nsnode, FALSE)->node;
break;
case TEXT_NODE:
- ret = HTMLDOMTextNode_Create(doc, nsnode);
+ hres = HTMLDOMTextNode_Create(doc, nsnode, ret);
+ if(FAILED(hres))
+ return hres;
break;
- case COMMENT_NODE:
- ret = &HTMLCommentElement_Create(doc, nsnode)->node;
+ case COMMENT_NODE: {
+ HTMLElement *comment;
+ hres = HTMLCommentElement_Create(doc, nsnode, &comment);
+ if(FAILED(hres))
+ return hres;
+ *ret = &comment->node;
break;
- default:
- ret = heap_alloc_zero(sizeof(HTMLDOMNode));
- ret->vtbl = &HTMLDOMNodeImplVtbl;
- HTMLDOMNode_Init(doc, ret, nsnode);
}
+ default: {
+ HTMLDOMNode *node;
- TRACE("type %d ret %p\n", node_type, ret);
+ node = heap_alloc_zero(sizeof(HTMLDOMNode));
+ if(!node)
+ return E_OUTOFMEMORY;
- return ret;
+ node->vtbl = &HTMLDOMNodeImplVtbl;
+ HTMLDOMNode_Init(doc, node, nsnode);
+ *ret = node;
+ }
+ }
+
+ TRACE("type %d ret %p\n", node_type, *ret);
+ return S_OK;
}
/*
@@ -1037,8 +1055,7 @@ HRESULT get_node(HTMLDocumentNode *This, nsIDOMNode *nsnode, BOOL create, HTMLDO
return S_OK;
}
- *ret = create_node(This, nsnode);
- return *ret ? S_OK : E_OUTOFMEMORY;
+ return create_node(This, nsnode, ret);
}
/*
diff --git a/dlls/mshtml/htmltextnode.c b/dlls/mshtml/htmltextnode.c
index 1bbca53..7cf7a11 100644
--- a/dlls/mshtml/htmltextnode.c
+++ b/dlls/mshtml/htmltextnode.c
@@ -190,8 +190,12 @@ static void HTMLDOMTextNode_destructor(HTMLDOMNode *iface)
static HRESULT HTMLDOMTextNode_clone(HTMLDOMNode *iface, nsIDOMNode *nsnode, HTMLDOMNode **ret)
{
HTMLDOMTextNode *This = HTMLTEXT_NODE_THIS(iface);
+ HRESULT hres;
+
+ hres = HTMLDOMTextNode_Create(This->node.doc, nsnode, ret);
+ if(FAILED(hres))
+ return hres;
- *ret = HTMLDOMTextNode_Create(This->node.doc, nsnode);
IHTMLDOMNode_AddRef(HTMLDOMNODE(*ret));
return S_OK;
}
@@ -217,21 +221,28 @@ static dispex_static_data_t HTMLDOMTextNode_dispex = {
HTMLDOMTextNode_iface_tids
};
-HTMLDOMNode *HTMLDOMTextNode_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode)
+HRESULT HTMLDOMTextNode_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode, HTMLDOMNode **node)
{
HTMLDOMTextNode *ret;
nsresult nsres;
ret = heap_alloc_zero(sizeof(*ret));
+ if(!ret)
+ return E_OUTOFMEMORY;
+
ret->node.vtbl = &HTMLDOMTextNodeImplVtbl;
ret->lpIHTMLDOMTextNodeVtbl = &HTMLDOMTextNodeVtbl;
- init_dispex(&ret->node.dispex, (IUnknown*)HTMLTEXT(ret), &HTMLDOMTextNode_dispex);
- HTMLDOMNode_Init(doc, &ret->node, nsnode);
-
nsres = nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMText, (void**)&ret->nstext);
- if(NS_FAILED(nsres))
+ if(NS_FAILED(nsres)) {
ERR("Could not get nsIDOMText iface: %08x\n", nsres);
+ heap_free(ret);
+ return E_FAIL;
+ }
- return &ret->node;
+ init_dispex(&ret->node.dispex, (IUnknown*)HTMLTEXT(ret), &HTMLDOMTextNode_dispex);
+ HTMLDOMNode_Init(doc, &ret->node, nsnode);
+
+ *node = &ret->node;
+ return S_OK;
}
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 9d8113f..b8ffffe 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -818,10 +818,10 @@ HRESULT get_node_text(HTMLDOMNode*,BSTR*);
HRESULT create_nselem(HTMLDocumentNode*,const WCHAR*,nsIDOMHTMLElement**);
-HTMLDOMNode *HTMLDOMTextNode_Create(HTMLDocumentNode*,nsIDOMNode*);
+HRESULT HTMLDOMTextNode_Create(HTMLDocumentNode*,nsIDOMNode*,HTMLDOMNode**);
HTMLElement *HTMLElement_Create(HTMLDocumentNode*,nsIDOMNode*,BOOL);
-HTMLElement *HTMLCommentElement_Create(HTMLDocumentNode*,nsIDOMNode*);
+HRESULT HTMLCommentElement_Create(HTMLDocumentNode*,nsIDOMNode*,HTMLElement**);
HTMLElement *HTMLAnchorElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*);
HTMLElement *HTMLBodyElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*);
HTMLElement *HTMLEmbedElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*);
More information about the wine-cvs
mailing list