From 57db798965e974d43fec84a1dbc9cf7f78f67cd7 Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Wed, 31 Oct 2018 14:21:30 +0100 Subject: [PATCH] webservices: Add support for UTF-8 encoded text in read_message_id. Signed-off-by: Hans Leidekker Signed-off-by: Alexandre Julliard --- dlls/webservices/msg.c | 22 +++++++++++++++++----- dlls/webservices/reader.c | 2 +- dlls/webservices/webservices_private.h | 1 + 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/dlls/webservices/msg.c b/dlls/webservices/msg.c index 4ccf82eaccb..a53fd92e2ea 100644 --- a/dlls/webservices/msg.c +++ b/dlls/webservices/msg.c @@ -846,21 +846,33 @@ static HRESULT read_message_id( WS_XML_READER *reader, GUID *ret ) { const WS_XML_NODE *node; const WS_XML_TEXT_NODE *text; - const WS_XML_UNIQUE_ID_TEXT *id; HRESULT hr; if ((hr = WsReadNode( reader, NULL )) != S_OK) return hr; if ((hr = WsGetReaderNode( reader, &node, NULL )) != S_OK) return hr; if (node->nodeType != WS_XML_NODE_TYPE_TEXT) return WS_E_INVALID_FORMAT; text = (const WS_XML_TEXT_NODE *)node; - if (text->text->textType != WS_XML_TEXT_TYPE_UNIQUE_ID) + + switch (text->text->textType) { + case WS_XML_TEXT_TYPE_UTF8: + { + const WS_XML_UTF8_TEXT *utf8 = (const WS_XML_UTF8_TEXT *)text->text; + if (utf8->value.length != 45 || memcmp( utf8->value.bytes, "urn:uuid:", 9 )) + return WS_E_INVALID_FORMAT; + + return str_to_guid( utf8->value.bytes + 9, utf8->value.length - 9, ret ); + } + case WS_XML_TEXT_TYPE_UNIQUE_ID: + { + const WS_XML_UNIQUE_ID_TEXT *id = (const WS_XML_UNIQUE_ID_TEXT *)text->text; + *ret = id->value; + return S_OK; + } + default: FIXME( "unhandled text type %u\n", text->text->textType ); return E_NOTIMPL; } - id = (const WS_XML_UNIQUE_ID_TEXT *)text->text; - *ret = id->value; - return S_OK; } static HRESULT read_envelope_start( struct msg *msg, WS_XML_READER *reader ) diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c index a5ff59a417e..8cf3f24d298 100644 --- a/dlls/webservices/reader.c +++ b/dlls/webservices/reader.c @@ -3841,7 +3841,7 @@ static HRESULT str_to_float( const unsigned char *str, ULONG len, float *ret ) return S_OK; } -static HRESULT str_to_guid( const unsigned char *str, ULONG len, GUID *ret ) +HRESULT str_to_guid( const unsigned char *str, ULONG len, GUID *ret ) { static const unsigned char hex[] = { diff --git a/dlls/webservices/webservices_private.h b/dlls/webservices/webservices_private.h index d981527bb24..b482b5ba203 100644 --- a/dlls/webservices/webservices_private.h +++ b/dlls/webservices/webservices_private.h @@ -71,6 +71,7 @@ HRESULT read_header( WS_XML_READER *, const WS_XML_STRING *, const WS_XML_STRING HRESULT create_header_buffer( WS_XML_READER *, WS_HEAP *, WS_XML_BUFFER ** ) DECLSPEC_HIDDEN; HRESULT text_to_text( const WS_XML_TEXT *, const WS_XML_TEXT *, ULONG *, WS_XML_TEXT ** ) DECLSPEC_HIDDEN; HRESULT text_to_utf8text( const WS_XML_TEXT *, const WS_XML_UTF8_TEXT *, ULONG *, WS_XML_UTF8_TEXT ** ) DECLSPEC_HIDDEN; +HRESULT str_to_guid( const unsigned char *, ULONG, GUID * ) DECLSPEC_HIDDEN; WS_XML_UTF8_TEXT *alloc_utf8_text( const BYTE *, ULONG ) DECLSPEC_HIDDEN; WS_XML_UTF16_TEXT *alloc_utf16_text( const BYTE *, ULONG ) DECLSPEC_HIDDEN; WS_XML_BASE64_TEXT *alloc_base64_text( const BYTE *, ULONG ) DECLSPEC_HIDDEN;