Module: wine Branch: master Commit: 6086ad0fe384cd6744cf5c83f2ad4f336e381845 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6086ad0fe384cd6744cf5c83f2...
Author: Hans Leidekker hans@codeweavers.com Date: Thu Jan 21 15:27:58 2016 +0100
webservices: Reject end elements without a parent in the writer.
Signed-off-by: Hans Leidekker hans@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/webservices/reader.c | 4 ++-- dlls/webservices/webservices_private.h | 2 ++ dlls/webservices/writer.c | 5 ++++- 3 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c index ae3d62a..13ca50b 100644 --- a/dlls/webservices/reader.c +++ b/dlls/webservices/reader.c @@ -1063,8 +1063,8 @@ static BOOL cmp_localname( const unsigned char *name1, ULONG len1, const unsigne return TRUE; }
-static struct node *find_parent_element( struct node *node, const WS_XML_STRING *prefix, - const WS_XML_STRING *localname ) +struct node *find_parent_element( struct node *node, const WS_XML_STRING *prefix, + const WS_XML_STRING *localname ) { struct node *parent; const WS_XML_STRING *str; diff --git a/dlls/webservices/webservices_private.h b/dlls/webservices/webservices_private.h index bae2149..4eeedf5 100644 --- a/dlls/webservices/webservices_private.h +++ b/dlls/webservices/webservices_private.h @@ -32,6 +32,8 @@ WS_XML_STRING *alloc_xml_string( const unsigned char *, ULONG ) DECLSPEC_HIDDEN; WS_XML_UTF8_TEXT *alloc_utf8_text( const unsigned char *, ULONG ) DECLSPEC_HIDDEN; HRESULT append_attribute( WS_XML_ELEMENT_NODE *, WS_XML_ATTRIBUTE * ) DECLSPEC_HIDDEN; void free_attribute( WS_XML_ATTRIBUTE * ) DECLSPEC_HIDDEN; +struct node *find_parent_element( struct node *, const WS_XML_STRING *, + const WS_XML_STRING * ) DECLSPEC_HIDDEN;
struct node { diff --git a/dlls/webservices/writer.c b/dlls/webservices/writer.c index 0178978..62e78be 100644 --- a/dlls/webservices/writer.c +++ b/dlls/webservices/writer.c @@ -546,10 +546,13 @@ static HRESULT write_startelement( struct writer *writer )
static HRESULT write_endelement( struct writer *writer ) { - WS_XML_ELEMENT_NODE *elem = (WS_XML_ELEMENT_NODE *)writer->current; + struct node *node = find_parent_element( writer->current, NULL, NULL ); + WS_XML_ELEMENT_NODE *elem = &node->hdr; ULONG size; HRESULT hr;
+ if (!elem) return WS_E_INVALID_FORMAT; + /* '</prefix:localname>' */
size = elem->localName->length + 3 /* '</>' */;