Shaun Ren : webservices: Detect when a message contains a fault in read_envelope_start.
Alexandre Julliard
julliard at winehq.org
Fri Aug 5 14:42:32 CDT 2022
Module: wine
Branch: master
Commit: dfd6cb97682aaa981fb978271b3c01a2e3035d24
URL: https://gitlab.winehq.org/wine/wine/-/commit/dfd6cb97682aaa981fb978271b3c01a2e3035d24
Author: Shaun Ren <sren at codeweavers.com>
Date: Wed Aug 3 19:16:35 2022 -0400
webservices: Detect when a message contains a fault in read_envelope_start.
Signed-off-by: Shaun Ren <sren at codeweavers.com>
---
dlls/webservices/msg.c | 34 +++++++++++++++++++++++++++++++++-
dlls/webservices/tests/msg.c | 21 ++++++++++++++++++++-
include/webservices.h | 15 +++++++++++++++
3 files changed, 68 insertions(+), 2 deletions(-)
diff --git a/dlls/webservices/msg.c b/dlls/webservices/msg.c
index 98d43660957..e4d4fce8ce4 100644
--- a/dlls/webservices/msg.c
+++ b/dlls/webservices/msg.c
@@ -42,6 +42,10 @@ static const struct prop_desc msg_props[] =
{ sizeof(WS_XML_READER *), TRUE }, /* WS_MESSAGE_PROPERTY_BODY_READER */
{ sizeof(WS_XML_WRITER *), TRUE }, /* WS_MESSAGE_PROPERTY_BODY_WRITER */
{ sizeof(BOOL), TRUE }, /* WS_MESSAGE_PROPERTY_IS_ADDRESSED */
+ { sizeof(WS_HEAP_PROPERTIES), TRUE }, /* WS_MESSAGE_PROPERTY_HEAP_PROPERTIES */
+ { sizeof(WS_XML_READER_PROPERTIES), TRUE }, /* WS_MESSAGE_PROPERTY_XML_READER_PROPERTIES */
+ { sizeof(WS_XML_WRITER_PROPERTIES), TRUE }, /* WS_MESSAGE_PROPERTY_XML_WRITER_PROPERTIES */
+ { sizeof(BOOL), FALSE }, /* WS_MESSAGE_PROPERTY_IS_FAULT */
};
struct header
@@ -122,6 +126,7 @@ static void free_header( struct header *header )
static void reset_msg( struct msg *msg )
{
+ BOOL isfault = FALSE;
ULONG i;
msg->state = WS_MESSAGE_STATE_EMPTY;
@@ -150,6 +155,8 @@ static void reset_msg( struct msg *msg )
memset( &msg->ctx_send, 0, sizeof(msg->ctx_send) );
memset( &msg->ctx_receive, 0, sizeof(msg->ctx_receive) );
+
+ prop_set( msg->prop, msg->prop_count, WS_MESSAGE_PROPERTY_IS_FAULT, &isfault, sizeof(isfault) );
}
static void free_msg( struct msg *msg )
@@ -375,6 +382,13 @@ HRESULT WINAPI WsGetMessageProperty( WS_MESSAGE *handle, WS_MESSAGE_PROPERTY_ID
else *(BOOL *)buf = msg->is_addressed;
break;
+ case WS_MESSAGE_PROPERTY_HEAP_PROPERTIES:
+ case WS_MESSAGE_PROPERTY_XML_READER_PROPERTIES:
+ case WS_MESSAGE_PROPERTY_XML_WRITER_PROPERTIES:
+ FIXME( "property %u not supported\n", id );
+ hr = E_NOTIMPL;
+ break;
+
default:
hr = prop_get( msg->prop, msg->prop_count, id, buf, size );
}
@@ -877,6 +891,18 @@ static BOOL match_current_element( WS_XML_READER *reader, const WS_XML_STRING *l
return WsXmlStringEquals( elem->localName, localname, NULL ) == S_OK;
}
+static BOOL match_current_element_with_ns( WS_XML_READER *reader, const WS_XML_STRING *localname, const WS_XML_STRING *ns )
+{
+ const WS_XML_NODE *node;
+ const WS_XML_ELEMENT_NODE *elem;
+
+ if (WsGetReaderNode( reader, &node, NULL ) != S_OK) return FALSE;
+ if (node->nodeType != WS_XML_NODE_TYPE_ELEMENT) return FALSE;
+ elem = (const WS_XML_ELEMENT_NODE *)node;
+ return WsXmlStringEquals( elem->localName, localname, NULL ) == S_OK &&
+ WsXmlStringEquals( elem->ns, ns, NULL ) == S_OK;
+}
+
static HRESULT read_message_id( WS_XML_READER *reader, GUID *ret )
{
const WS_XML_NODE *node;
@@ -914,6 +940,9 @@ static HRESULT read_envelope_start( struct msg *msg, WS_XML_READER *reader )
{
static const WS_XML_STRING envelope = {8, (BYTE *)"Envelope"}, body = {4, (BYTE *)"Body"};
static const WS_XML_STRING header = {6, (BYTE *)"Header"}, msgid = {9, (BYTE *)"MessageID"};
+ static const WS_XML_STRING fault = {5, (BYTE *)"Fault"};
+ const WS_XML_STRING *ns_env = get_env_namespace( msg->version_env );
+ BOOL isfault;
HRESULT hr;
if ((hr = WsReadNode( reader, NULL )) != S_OK) return hr;
@@ -930,7 +959,10 @@ static HRESULT read_envelope_start( struct msg *msg, WS_XML_READER *reader )
}
}
if (!match_current_element( reader, &body )) return WS_E_INVALID_FORMAT;
- return WsReadNode( reader, NULL );
+ if ((hr = WsReadNode( reader, NULL )) != S_OK) return hr;
+
+ isfault = match_current_element_with_ns( reader, &fault, ns_env );
+ return prop_set( msg->prop, msg->prop_count, WS_MESSAGE_PROPERTY_IS_FAULT, &isfault, sizeof(isfault) );
}
/**************************************************************************
diff --git a/dlls/webservices/tests/msg.c b/dlls/webservices/tests/msg.c
index 2af2dd334e7..feeedc940d5 100644
--- a/dlls/webservices/tests/msg.c
+++ b/dlls/webservices/tests/msg.c
@@ -1071,10 +1071,14 @@ static void test_WsReadEnvelopeStart(void)
{
static const char xml[] =
"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body/></s:Envelope>";
- WS_MESSAGE *msg, *msg2;
+ static const char faultxml[] =
+ "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body>"
+ "<s:Fault/></s:Body></s:Envelope>";
+ WS_MESSAGE *msg, *msg2, *msg3;
WS_XML_READER *reader;
WS_MESSAGE_STATE state;
const WS_XML_NODE *node;
+ BOOL isfault;
HRESULT hr;
hr = WsReadEnvelopeStart( NULL, NULL, NULL, NULL, NULL );
@@ -1127,8 +1131,23 @@ static void test_WsReadEnvelopeStart(void)
ok( hr == S_OK, "got %#lx\n", hr );
ok( node->nodeType == WS_XML_NODE_TYPE_EOF, "got %u\n", node->nodeType );
+ hr = WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1, WS_ADDRESSING_VERSION_0_9, NULL, 0, &msg3, NULL );
+ ok( hr == S_OK, "got %#lx\n", hr );
+
+ hr = set_input( reader, faultxml, strlen(faultxml) );
+ ok( hr == S_OK, "got %#lx\n", hr );
+
+ hr = WsReadEnvelopeStart( msg3, reader, NULL, NULL, NULL );
+ ok( hr == S_OK, "got %#lx\n", hr );
+
+ isfault = FALSE;
+ hr = WsGetMessageProperty( msg3, WS_MESSAGE_PROPERTY_IS_FAULT, &isfault, sizeof(isfault), NULL );
+ ok( hr == S_OK, "got %#lx\n", hr );
+ ok( isfault, "isfault == FALSE\n" );
+
WsFreeMessage( msg );
WsFreeMessage( msg2 );
+ WsFreeMessage( msg3 );
WsFreeReader( reader );
}
diff --git a/include/webservices.h b/include/webservices.h
index 6657ee84201..bda09e06bc8 100644
--- a/include/webservices.h
+++ b/include/webservices.h
@@ -113,6 +113,11 @@ typedef struct _WS_HEAP_PROPERTY {
ULONG valueSize;
} WS_HEAP_PROPERTY;
+typedef struct _WS_HEAP_PROPERTIES {
+ WS_HEAP_PROPERTY *properties;
+ ULONG propertyCount;
+} WS_HEAP_PROPERTIES;
+
typedef ULONG WS_XML_BUFFER_PROPERTY_ID;
typedef struct _WS_XML_BUFFER_PROPERTY {
@@ -145,6 +150,11 @@ typedef struct _WS_XML_READER_PROPERTY {
ULONG valueSize;
} WS_XML_READER_PROPERTY;
+typedef struct _WS_XML_READER_PROPERTIES {
+ WS_XML_READER_PROPERTY *properties;
+ ULONG propertyCount;
+} WS_XML_READER_PROPERTIES;
+
typedef enum {
WS_XML_WRITER_PROPERTY_MAX_DEPTH,
WS_XML_WRITER_PROPERTY_ALLOW_FRAGMENT,
@@ -173,6 +183,11 @@ typedef struct _WS_XML_WRITER_PROPERTY {
ULONG valueSize;
} WS_XML_WRITER_PROPERTY;
+typedef struct _WS_XML_WRITER_PROPERTIES {
+ WS_XML_WRITER_PROPERTY *properties;
+ ULONG propertyCount;
+} WS_XML_WRITER_PROPERTIES;
+
typedef struct _WS_BYTES {
ULONG length;
BYTE *bytes;
More information about the wine-cvs
mailing list