From: Christophe Fergeau <cfergeau@xxxxxxxxxx> This makes it easier to move the VDIPort API to a different file, and make it as self-contained as possible. --- server/reds.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/server/reds.c b/server/reds.c index 736dca6..08913e8 100644 --- a/server/reds.c +++ b/server/reds.c @@ -632,14 +632,16 @@ static void vdi_port_read_buf_release(uint8_t *data, void *opaque) } /* returns TRUE if the buffer can be forwarded */ -static int vdi_port_read_buf_process(RedsState *reds, VDIReadBuf *buf) +static gboolean vdi_port_read_buf_process(VDIPortState *state, VDIReadBuf *buf, gboolean *error) { - VDIPortState *state = &reds->agent_state; int res; + *error = FALSE; + switch (state->vdi_chunk_header.port) { case VDP_CLIENT_PORT: { - res = agent_msg_filter_process_data(&state->read_filter, reds, + res = agent_msg_filter_process_data(&state->read_filter, + spice_char_device_get_server(state->base), buf->data, buf->len); switch (res) { case AGENT_MSG_FILTER_OK: @@ -647,7 +649,7 @@ static int vdi_port_read_buf_process(RedsState *reds, VDIReadBuf *buf) case AGENT_MSG_FILTER_DISCARD: return FALSE; case AGENT_MSG_FILTER_PROTO_ERROR: - reds_agent_remove(reds); + *error = TRUE; return FALSE; } } @@ -655,7 +657,7 @@ static int vdi_port_read_buf_process(RedsState *reds, VDIReadBuf *buf) return FALSE; default: spice_warning("invalid port"); - reds_agent_remove(reds); + *error = TRUE; return FALSE; } } @@ -739,7 +741,8 @@ static SpiceCharDeviceMsgToClient *vdi_port_read_one_msg_from_device(SpiceCharDe state->message_receive_len -= state->receive_len; state->read_state = VDI_PORT_READ_STATE_READ_DATA; } - case VDI_PORT_READ_STATE_READ_DATA: + case VDI_PORT_READ_STATE_READ_DATA: { + gboolean error = FALSE; n = sif->read(reds->vdagent, state->receive_pos, state->receive_len); if (!n) { return NULL; @@ -758,11 +761,15 @@ static SpiceCharDeviceMsgToClient *vdi_port_read_one_msg_from_device(SpiceCharDe } else { state->read_state = VDI_PORT_READ_STATE_GET_BUFF; } - if (vdi_port_read_buf_process(reds, dispatch_buf)) { + if (vdi_port_read_buf_process(&reds->agent_state, dispatch_buf, &error)) { return dispatch_buf; } else { + if (error) { + reds_agent_remove(reds); + } vdi_port_read_buf_unref(dispatch_buf); } + } } /* END switch */ } /* END while */ return NULL; @@ -1122,18 +1129,22 @@ void reds_on_main_channel_migrate(RedsState *reds, MainChannelClient *mcc) if (agent_state->read_filter.msg_data_to_read || read_data_len > sizeof(VDAgentMessage)) { /* msg header has been read */ VDIReadBuf *read_buf = agent_state->current_read_buf; + gboolean error = FALSE; spice_debug("push partial read %u (msg first chunk? %d)", read_data_len, !agent_state->read_filter.msg_data_to_read); read_buf->len = read_data_len; - if (vdi_port_read_buf_process(reds, read_buf)) { + if (vdi_port_read_buf_process(&reds->agent_state, read_buf, &error)) { main_channel_client_push_agent_data(mcc, read_buf->data, read_buf->len, vdi_port_read_buf_release, read_buf); } else { + if (error) { + reds_agent_remove(reds); + } vdi_port_read_buf_unref(read_buf); } -- 2.5.0 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel