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_ENCODING), TRUE }, /* WS_CHANNEL_PROPERTY_ENCODING */
{ sizeof(WS_ENVELOPE_VERSION), FALSE }, /* WS_CHANNEL_PROPERTY_ENVELOPE_VERSION */ { sizeof(WS_ENVELOPE_VERSION), FALSE }, /* WS_CHANNEL_PROPERTY_ENVELOPE_VERSION */
{ sizeof(WS_ADDRESSING_VERSION), FALSE }, /* WS_CHANNEL_PROPERTY_ADDRESSING_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_CHANNEL_STATE), TRUE }, /* WS_CHANNEL_PROPERTY_STATE */
{ sizeof(WS_CALLBACK_MODEL), FALSE }, /* WS_CHANNEL_PROPERTY_ASYNC_CALLBACK_MODEL */ { sizeof(WS_CALLBACK_MODEL), FALSE }, /* WS_CHANNEL_PROPERTY_ASYNC_CALLBACK_MODEL */
{ sizeof(WS_IP_VERSION), FALSE }, /* WS_CHANNEL_PROPERTY_IP_VERSION */ { sizeof(WS_IP_VERSION), FALSE }, /* WS_CHANNEL_PROPERTY_IP_VERSION */
@ -236,6 +236,7 @@ struct channel
char *send_buf; char *send_buf;
ULONG send_buflen; ULONG send_buflen;
ULONG send_size; ULONG send_size;
ULONG dict_size;
ULONG prop_count; ULONG prop_count;
struct prop prop[ARRAY_SIZE( channel_props )]; 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: case WS_TCP_CHANNEL_BINDING:
channel->u.tcp.socket = -1; channel->u.tcp.socket = -1;
channel->encoding = WS_ENCODING_XML_BINARY_SESSION_1; channel->encoding = WS_ENCODING_XML_BINARY_SESSION_1;
channel->dict_size = 2048;
break; break;
case WS_UDP_CHANNEL_BINDING: case WS_UDP_CHANNEL_BINDING:
@ -534,6 +536,16 @@ static HRESULT create_channel( WS_CHANNEL_TYPE type, WS_CHANNEL_BINDING binding,
break; 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: default:
if ((hr = prop_set( channel->prop, channel->prop_count, prop->id, prop->value, prop->valueSize )) != S_OK) 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; else *(WS_CHANNEL_STATE *)buf = channel->state;
break; 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: default:
hr = prop_get( channel->prop, channel->prop_count, id, buf, size ); 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( hr == S_OK, "got %#lx\n", hr );
ok( addr_version == WS_ADDRESSING_VERSION_1_0, "got %u\n", addr_version ); 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 */ /* read-only property */
state = 0xdeadbeef; state = 0xdeadbeef;
hr = WsGetChannelProperty( channel, WS_CHANNEL_PROPERTY_STATE, &state, sizeof(state), NULL ); 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( hr == S_OK, "got %#lx\n", hr );
ok( addr_version == WS_ADDRESSING_VERSION_1_0, "got %u\n", addr_version ); 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; size = 0xdeadbeef;
hr = WsGetChannelProperty( channel, WS_CHANNEL_PROPERTY_MAX_SESSION_DICTIONARY_SIZE, &size, sizeof(size), NULL ); hr = WsGetChannelProperty( channel, WS_CHANNEL_PROPERTY_MAX_SESSION_DICTIONARY_SIZE, &size, sizeof(size), NULL );
ok( hr == S_OK, "got %#lx\n", hr ); 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 ); WsFreeChannel( channel );
} }