From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/node.c | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 91e58e6ae9e..751c6c3963a 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -1046,44 +1046,51 @@ HRESULT domnode_create(DOMNodeType type, const WCHAR *name, int name_len, const { struct domnode *object; WCHAR *p; - BSTR str; *node = NULL; if (!(object = calloc(1, sizeof(*object)))) return E_OUTOFMEMORY; - str = SysAllocStringLen(name, name_len); + list_init(&object->entry); + list_init(&object->owner_entry); + list_init(&object->children); + list_init(&object->attributes); + list_init(&object->owned); + object->owner = owner; + /* Document node does not have an owner */ + if (owner) + list_add_tail(&owner->owned, &object->owner_entry); + + object->qname = SysAllocStringLen(name, name_len); if (type == NODE_ELEMENT || type == NODE_ATTRIBUTE) { - if (!parser_is_valid_qualified_name(str)) + if (!parser_is_valid_qualified_name(object->qname)) { - SysFreeString(str); + domnode_destroy_tree(object); return E_FAIL; } - if ((p = wcschr(str, ':'))) + if ((p = wcschr(object->qname, ':'))) { - object->prefix = SysAllocStringLen(str, p - str); + object->prefix = SysAllocStringLen(object->qname, p - object->qname); object->name = SysAllocString(p + 1); } else { - object->name = str; + object->name = object->qname; } } else { - object->name = str; + object->name = object->qname; } - object->qname = str; if (uri_len) { if (!(object->uri = SysAllocStringLen(uri, uri_len))) { - free(object->name); - free(object); + domnode_destroy_tree(object); return E_OUTOFMEMORY; } } @@ -1099,16 +1106,6 @@ HRESULT domnode_create(DOMNodeType type, const WCHAR *name, int name_len, const ; } - list_init(&object->entry); - list_init(&object->owner_entry); - list_init(&object->children); - list_init(&object->attributes); - list_init(&object->owned); - object->owner = owner; - /* Document node does not have an owner */ - if (owner) - list_add_tail(&owner->owned, &object->owner_entry); - *node = object; return S_OK; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10706