[Spice-devel] [PATCH] fix regression due to callback called earlier
Frediano Ziglio
fziglio at redhat.com
Thu Feb 18 12:39:07 UTC 2016
>
> Patch 1f210080609f2c00b4d1859eb0b363a38838e7d3 ("Remove use of global
> 'reds' from AgentMsgFilter") introduced a regression. This because
> QXLInterface->client_monitors_config was called before returning
> from spice_add_interface. Some client of spice-server expect the
> spice_add_interface already returned and some state change was done
> before client_monitors_config was called.
>
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
This fixes https://bugs.freedesktop.org/show_bug.cgi?id=94192.
I was wondering if would be better to revert previous and then
add this implementation but in this case we'll lose the
int -> gboolean changes.
Frediano
> ---
> server/agent-msg-filter.c | 5 ++---
> server/agent-msg-filter.h | 3 +--
> server/reds.c | 18 ++++++------------
> 3 files changed, 9 insertions(+), 17 deletions(-)
>
> diff --git a/server/agent-msg-filter.c b/server/agent-msg-filter.c
> index 14d5100..d72a3e4 100644
> --- a/server/agent-msg-filter.c
> +++ b/server/agent-msg-filter.c
> @@ -29,17 +29,16 @@
>
> void agent_msg_filter_init(struct AgentMsgFilter *filter,
> gboolean copy_paste, gboolean file_xfer,
> - gboolean use_client_monitors_config,
> int discard_all)
> {
> memset(filter, 0, sizeof(*filter));
> filter->copy_paste_enabled = copy_paste;
> filter->file_xfer_enabled = file_xfer;
> - filter->use_client_monitors_config = use_client_monitors_config;
> filter->discard_all = discard_all;
> }
>
> int agent_msg_filter_process_data(struct AgentMsgFilter *filter,
> + RedsState *reds,
> uint8_t *data, uint32_t len)
> {
> struct VDAgentMessage msg_header;
> @@ -96,7 +95,7 @@ data_to_read:
> }
> break;
> case VD_AGENT_MONITORS_CONFIG:
> - if (filter->use_client_monitors_config) {
> + if (reds_use_client_monitors_config(reds)) {
> filter->result = AGENT_MSG_FILTER_MONITORS_CONFIG;
> } else {
> filter->result = AGENT_MSG_FILTER_OK;
> diff --git a/server/agent-msg-filter.h b/server/agent-msg-filter.h
> index c04face..a4fc4cf 100644
> --- a/server/agent-msg-filter.h
> +++ b/server/agent-msg-filter.h
> @@ -37,15 +37,14 @@ typedef struct AgentMsgFilter {
> int result;
> gboolean copy_paste_enabled;
> gboolean file_xfer_enabled;
> - gboolean use_client_monitors_config;
> gboolean discard_all;
> } AgentMsgFilter;
>
> void agent_msg_filter_init(struct AgentMsgFilter *filter,
> gboolean copy_paste, gboolean file_xfer,
> - gboolean use_client_monitors_config,
> gboolean discard_all);
> int agent_msg_filter_process_data(struct AgentMsgFilter *filter,
> + SpiceServer *reds,
> uint8_t *data, uint32_t len);
>
> #endif
> diff --git a/server/reds.c b/server/reds.c
> index 5fb5825..b917f26 100644
> --- a/server/reds.c
> +++ b/server/reds.c
> @@ -407,8 +407,7 @@ static void reds_reset_vdp(RedsState *reds)
> }
> /* Reset read filter to start with clean state when the agent reconnects
> */
> agent_msg_filter_init(&state->read_filter, reds->agent_copypaste,
> - reds->agent_file_xfer,
> - reds_use_client_monitors_config(reds), TRUE);
> + reds->agent_file_xfer, TRUE);
> /* Throw away pending chunks from the current (if any) and future
> * messages written by the client.
> * TODO: client should clear its agent messages queue when the agent
> @@ -522,8 +521,7 @@ void reds_client_disconnect(RedsState *reds, RedClient
> *client)
>
> /* Reset write filter to start with clean state on client reconnect
> */
> agent_msg_filter_init(&reds->agent_state.write_filter,
> reds->agent_copypaste,
> - reds->agent_file_xfer,
> - reds_use_client_monitors_config(reds), TRUE);
> + reds->agent_file_xfer, TRUE);
>
> /* Throw away pending chunks from the current (if any) and future
> * messages read from the agent */
> @@ -639,7 +637,7 @@ static int vdi_port_read_buf_process(RedsState *reds,
> VDIReadBuf *buf)
>
> switch (state->vdi_chunk_header.port) {
> case VDP_CLIENT_PORT: {
> - res = agent_msg_filter_process_data(&state->read_filter,
> + res = agent_msg_filter_process_data(&state->read_filter, reds,
> buf->data, buf->len);
> switch (res) {
> case AGENT_MSG_FILTER_OK:
> @@ -1049,7 +1047,7 @@ void reds_on_main_agent_data(RedsState *reds,
> MainChannelClient *mcc, void *mess
> VDIChunkHeader *header;
> int res;
>
> - res = agent_msg_filter_process_data(&reds->agent_state.write_filter,
> + res = agent_msg_filter_process_data(&reds->agent_state.write_filter,
> reds,
> message, size);
> switch (res) {
> case AGENT_MSG_FILTER_OK:
> @@ -3214,8 +3212,6 @@ SPICE_GNUC_VISIBLE int
> spice_server_add_interface(SpiceServer *s,
> red_dispatcher_init(qxl);
> dispatcher = qxl->st->dispatcher;
> reds->dispatchers = g_list_prepend(reds->dispatchers, dispatcher);
> - reds->agent_state.write_filter.use_client_monitors_config =
> reds_use_client_monitors_config(reds);
> - reds->agent_state.read_filter.use_client_monitors_config =
> reds_use_client_monitors_config(reds);
>
> /* this function has to be called after the dispatcher is on the
> list
> * as QXLInstance clients expect the dispatcher to be on the list
> when
> @@ -3321,11 +3317,9 @@ static void reds_init_vd_agent_resources(RedsState
> *reds)
>
> ring_init(&state->read_bufs);
> agent_msg_filter_init(&state->write_filter, reds->agent_copypaste,
> - reds->agent_file_xfer,
> - reds_use_client_monitors_config(reds), TRUE);
> + reds->agent_file_xfer, TRUE);
> agent_msg_filter_init(&state->read_filter, reds->agent_copypaste,
> - reds->agent_file_xfer,
> - reds_use_client_monitors_config(reds), TRUE);
> + reds->agent_file_xfer, TRUE);
>
> state->read_state = VDI_PORT_READ_STATE_READ_HEADER;
> state->receive_pos = (uint8_t *)&state->vdi_chunk_header;
> --
> 2.5.0
>
>
More information about the Spice-devel
mailing list