Module: wine Branch: master Commit: 6bf247f9378c183c922fb0d2742d04189c179cb1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6bf247f9378c183c922fb0d274...
Author: Jacek Caban jacek@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*);