webservices: Properly handle max session dictionary size channel property.

Treat WS_CHANNEL_PROPERTY_MAX_SESSION_DICTIONARY_SIZE as a read-only
property, and only allow it to be set upon channel creation.

Signed-off-by: Connor McAdams <cmcadams@codeweavers.com>
Signed-off-by: Hans Leidekker <hans@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Connor McAdams 2022-04-20 11:56:12 +02:00 committed by Alexandre Julliard
parent dc849b0a6d
commit c03f747a3a
2 changed files with 30 additions and 2 deletions

View File

@ -40,7 +40,7 @@ static const struct prop_desc channel_props[] =
{ sizeof(WS_ENCODING), TRUE }, /* WS_CHANNEL_PROPERTY_ENCODING */
{ sizeof(WS_ENVELOPE_VERSION), FALSE }, /* WS_CHANNEL_PROPERTY_ENVELOPE_VERSION */
{ sizeof(WS_ADDRESSING_VERSION), FALSE }, /* WS_CHANNEL_PROPERTY_ADDRESSING_VERSION */
{ sizeof(ULONG), FALSE }, /* WS_CHANNEL_PROPERTY_MAX_SESSION_DICTIONARY_SIZE */
{ sizeof(ULONG), TRUE }, /* WS_CHANNEL_PROPERTY_MAX_SESSION_DICTIONARY_SIZE */
{ sizeof(WS_CHANNEL_STATE), TRUE }, /* WS_CHANNEL_PROPERTY_STATE */
{ sizeof(WS_CALLBACK_MODEL), FALSE }, /* WS_CHANNEL_PROPERTY_ASYNC_CALLBACK_MODEL */
{ sizeof(WS_IP_VERSION), FALSE }, /* WS_CHANNEL_PROPERTY_IP_VERSION */
@ -236,6 +236,7 @@ struct channel
char *send_buf;
ULONG send_buflen;
ULONG send_size;
ULONG dict_size;
ULONG prop_count;
struct prop prop[ARRAY_SIZE( channel_props )];
};
@ -483,6 +484,7 @@ static HRESULT create_channel( WS_CHANNEL_TYPE type, WS_CHANNEL_BINDING binding,
case WS_TCP_CHANNEL_BINDING:
channel->u.tcp.socket = -1;
channel->encoding = WS_ENCODING_XML_BINARY_SESSION_1;
channel->dict_size = 2048;
break;
case WS_UDP_CHANNEL_BINDING:
@ -534,6 +536,16 @@ static HRESULT create_channel( WS_CHANNEL_TYPE type, WS_CHANNEL_BINDING binding,
break;
}
case WS_CHANNEL_PROPERTY_MAX_SESSION_DICTIONARY_SIZE:
if (channel->binding != WS_TCP_CHANNEL_BINDING || !prop->value || prop->valueSize != sizeof(channel->dict_size))
{
free_channel( channel );
return E_INVALIDARG;
}
channel->dict_size = *(ULONG *)prop->value;
break;
default:
if ((hr = prop_set( channel->prop, channel->prop_count, prop->id, prop->value, prop->valueSize )) != S_OK)
{
@ -712,6 +724,13 @@ HRESULT WINAPI WsGetChannelProperty( WS_CHANNEL *handle, WS_CHANNEL_PROPERTY_ID
else *(WS_CHANNEL_STATE *)buf = channel->state;
break;
case WS_CHANNEL_PROPERTY_MAX_SESSION_DICTIONARY_SIZE:
if (channel->binding != WS_TCP_CHANNEL_BINDING || !buf || size != sizeof(channel->dict_size))
hr = E_INVALIDARG;
else
*(ULONG *)buf = channel->dict_size;
break;
default:
hr = prop_get( channel->prop, channel->prop_count, id, buf, size );
}

View File

@ -66,6 +66,10 @@ static void test_WsCreateChannel(void)
ok( hr == S_OK, "got %#lx\n", hr );
ok( addr_version == WS_ADDRESSING_VERSION_1_0, "got %u\n", addr_version );
size = 0xdeadbeef;
hr = WsGetChannelProperty( channel, WS_CHANNEL_PROPERTY_MAX_SESSION_DICTIONARY_SIZE, &size, sizeof(size), NULL );
ok( hr == E_INVALIDARG, "got %#lx\n", hr );
/* read-only property */
state = 0xdeadbeef;
hr = WsGetChannelProperty( channel, WS_CHANNEL_PROPERTY_STATE, &state, sizeof(state), NULL );
@ -112,10 +116,15 @@ static void test_WsCreateChannel(void)
ok( hr == S_OK, "got %#lx\n", hr );
ok( addr_version == WS_ADDRESSING_VERSION_1_0, "got %u\n", addr_version );
/* Read-only, only settable on channel creation. */
size = 4096;
hr = WsSetChannelProperty( channel, WS_CHANNEL_PROPERTY_MAX_SESSION_DICTIONARY_SIZE, &size, sizeof(size), NULL );
ok( hr == E_INVALIDARG, "got %#lx\n", hr );
size = 0xdeadbeef;
hr = WsGetChannelProperty( channel, WS_CHANNEL_PROPERTY_MAX_SESSION_DICTIONARY_SIZE, &size, sizeof(size), NULL );
ok( hr == S_OK, "got %#lx\n", hr );
todo_wine ok( size == 2048, "got %lu\n", size );
ok( size == 2048, "got %lu\n", size );
WsFreeChannel( channel );
}