[client] spice: minor fixes, don't assume inputs channel exists

This commit is contained in:
Geoffrey McRae 2019-02-21 03:43:11 +11:00
parent 769edba1a5
commit 65c1e0391c
2 changed files with 68 additions and 17 deletions

View File

@ -40,6 +40,13 @@ typedef struct SpiceMsgMainInit
} }
SpiceMsgMainInit; SpiceMsgMainInit;
typedef struct SpiceMsgMainChannelsList
{
uint32_t num_of_channels;
//uint8_t channels[num_of_channels]
}
SpiceMainChannelsList;
typedef struct SpiceMsgcMainMouseModeRequest typedef struct SpiceMsgcMainMouseModeRequest
{ {
uint16_t mouse_mode; uint16_t mouse_mode;

View File

@ -261,10 +261,10 @@ bool spice_process_ack(struct SpiceChannel * channel)
bool spice_on_common_read(struct SpiceChannel * channel, SpiceDataHeader * header, bool * handled) bool spice_on_common_read(struct SpiceChannel * channel, SpiceDataHeader * header, bool * handled)
{ {
*handled = false;
if (!spice_read(channel, header, sizeof(SpiceDataHeader))) if (!spice_read(channel, header, sizeof(SpiceDataHeader)))
{ {
DEBUG_ERROR("read failure"); DEBUG_ERROR("read failure");
*handled = false;
return false; return false;
} }
@ -275,11 +275,8 @@ bool spice_on_common_read(struct SpiceChannel * channel, SpiceDataHeader * heade
#endif #endif
if (!channel->initDone) if (!channel->initDone)
{
*handled = false;
return true; return true;
}
switch(header->type) switch(header->type)
{ {
case SPICE_MSG_MIGRATE: case SPICE_MSG_MIGRATE:
@ -360,7 +357,6 @@ bool spice_on_common_read(struct SpiceChannel * channel, SpiceDataHeader * heade
} }
} }
*handled = false;
return true; return true;
} }
@ -402,16 +398,61 @@ bool spice_on_main_channel_read()
} }
spice.sessionID = msg.session_id; spice.sessionID = msg.session_id;
if (msg.current_mouse_mode != SPICE_MOUSE_MODE_CLIENT && !spice_mouse_mode(false))
{
DEBUG_ERROR("failed to set mouse mode");
return false;
}
if (!spice_write_msg(channel, SPICE_MSGC_MAIN_ATTACH_CHANNELS, NULL, 0))
{
spice_disconnect();
DEBUG_ERROR("failed to ask for channel list");
return false;
}
return true;
}
if (header.type == SPICE_MSG_MAIN_CHANNELS_LIST)
{
DEBUG_PROTO("SPICE_MSG_MAIN_CHANNELS_LIST");
SpiceMainChannelsList msg;
if (!spice_read(channel, &msg, sizeof(msg)))
{
DEBUG_ERROR("Failed to read channel list msg");
spice_disconnect();
return false;
}
// documentation doesn't state that the array is null terminated but it seems that it is
uint8_t channels[msg.num_of_channels+1];
if (!spice_read(channel, &channels, msg.num_of_channels+1))
{
DEBUG_ERROR("Failed to read channel list vector");
spice_disconnect();
return false;
}
for(int i = 0; i < msg.num_of_channels; ++i)
{
DEBUG_PROTO("channel %d = %u", i, channels[i]);
if (channels[i] == SPICE_CHANNEL_INPUTS)
{
if (spice.scInputs.connected)
{
DEBUG_ERROR("inputs channel already connected");
spice_disconnect();
return false;
}
if (!spice_connect_channel(&spice.scInputs)) if (!spice_connect_channel(&spice.scInputs))
{ {
DEBUG_ERROR("failed to connect inputs channel"); DEBUG_ERROR("failed to connect inputs channel");
return false; return false;
} }
}
if (msg.current_mouse_mode != SPICE_MOUSE_MODE_CLIENT && !spice_mouse_mode(false))
{
DEBUG_ERROR("failed to set mouse mode");
return false;
} }
return true; return true;
@ -698,12 +739,15 @@ bool spice_write_msg(struct SpiceChannel * channel, uint32_t type, const void *
return false; return false;
} }
if (buffer && size)
{
if (spice_write(channel, buffer, size) != size) if (spice_write(channel, buffer, size) != size)
{ {
DEBUG_ERROR("failed to write message body"); DEBUG_ERROR("failed to write message body");
LG_UNLOCK(channel->lock); LG_UNLOCK(channel->lock);
return false; return false;
} }
}
LG_UNLOCK(channel->lock); LG_UNLOCK(channel->lock);
return true; return true;
@ -798,7 +842,7 @@ bool spice_key_up(uint32_t code)
bool spice_mouse_mode(bool server) bool spice_mouse_mode(bool server)
{ {
DEBUG_MOUSE("%s", server ? "server" : "client"); DEBUG_MOUSE("%s", server ? "server" : "client");
if (!spice.scInputs.connected) if (!spice.scMain.connected)
{ {
DEBUG_ERROR("not connected"); DEBUG_ERROR("not connected");
return false; return false;