mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice
synced 2026-01-09 14:11:47 +00:00
fix regression due to callback called earlier
Patch 1f21008060 ("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@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
This commit is contained in:
parent
aa724b170b
commit
a1e62fa5ae
@ -29,17 +29,16 @@
|
|||||||
|
|
||||||
void agent_msg_filter_init(struct AgentMsgFilter *filter,
|
void agent_msg_filter_init(struct AgentMsgFilter *filter,
|
||||||
gboolean copy_paste, gboolean file_xfer,
|
gboolean copy_paste, gboolean file_xfer,
|
||||||
gboolean use_client_monitors_config,
|
|
||||||
int discard_all)
|
int discard_all)
|
||||||
{
|
{
|
||||||
memset(filter, 0, sizeof(*filter));
|
memset(filter, 0, sizeof(*filter));
|
||||||
filter->copy_paste_enabled = copy_paste;
|
filter->copy_paste_enabled = copy_paste;
|
||||||
filter->file_xfer_enabled = file_xfer;
|
filter->file_xfer_enabled = file_xfer;
|
||||||
filter->use_client_monitors_config = use_client_monitors_config;
|
|
||||||
filter->discard_all = discard_all;
|
filter->discard_all = discard_all;
|
||||||
}
|
}
|
||||||
|
|
||||||
int agent_msg_filter_process_data(struct AgentMsgFilter *filter,
|
int agent_msg_filter_process_data(struct AgentMsgFilter *filter,
|
||||||
|
RedsState *reds,
|
||||||
uint8_t *data, uint32_t len)
|
uint8_t *data, uint32_t len)
|
||||||
{
|
{
|
||||||
struct VDAgentMessage msg_header;
|
struct VDAgentMessage msg_header;
|
||||||
@ -96,7 +95,7 @@ data_to_read:
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case VD_AGENT_MONITORS_CONFIG:
|
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;
|
filter->result = AGENT_MSG_FILTER_MONITORS_CONFIG;
|
||||||
} else {
|
} else {
|
||||||
filter->result = AGENT_MSG_FILTER_OK;
|
filter->result = AGENT_MSG_FILTER_OK;
|
||||||
|
|||||||
@ -37,15 +37,14 @@ typedef struct AgentMsgFilter {
|
|||||||
int result;
|
int result;
|
||||||
gboolean copy_paste_enabled;
|
gboolean copy_paste_enabled;
|
||||||
gboolean file_xfer_enabled;
|
gboolean file_xfer_enabled;
|
||||||
gboolean use_client_monitors_config;
|
|
||||||
gboolean discard_all;
|
gboolean discard_all;
|
||||||
} AgentMsgFilter;
|
} AgentMsgFilter;
|
||||||
|
|
||||||
void agent_msg_filter_init(struct AgentMsgFilter *filter,
|
void agent_msg_filter_init(struct AgentMsgFilter *filter,
|
||||||
gboolean copy_paste, gboolean file_xfer,
|
gboolean copy_paste, gboolean file_xfer,
|
||||||
gboolean use_client_monitors_config,
|
|
||||||
gboolean discard_all);
|
gboolean discard_all);
|
||||||
int agent_msg_filter_process_data(struct AgentMsgFilter *filter,
|
int agent_msg_filter_process_data(struct AgentMsgFilter *filter,
|
||||||
|
SpiceServer *reds,
|
||||||
uint8_t *data, uint32_t len);
|
uint8_t *data, uint32_t len);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -407,8 +407,7 @@ static void reds_reset_vdp(RedsState *reds)
|
|||||||
}
|
}
|
||||||
/* Reset read filter to start with clean state when the agent reconnects */
|
/* Reset read filter to start with clean state when the agent reconnects */
|
||||||
agent_msg_filter_init(&state->read_filter, reds->agent_copypaste,
|
agent_msg_filter_init(&state->read_filter, reds->agent_copypaste,
|
||||||
reds->agent_file_xfer,
|
reds->agent_file_xfer, TRUE);
|
||||||
reds_use_client_monitors_config(reds), TRUE);
|
|
||||||
/* Throw away pending chunks from the current (if any) and future
|
/* Throw away pending chunks from the current (if any) and future
|
||||||
* messages written by the client.
|
* messages written by the client.
|
||||||
* TODO: client should clear its agent messages queue when the agent
|
* 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 */
|
/* Reset write filter to start with clean state on client reconnect */
|
||||||
agent_msg_filter_init(&reds->agent_state.write_filter, reds->agent_copypaste,
|
agent_msg_filter_init(&reds->agent_state.write_filter, reds->agent_copypaste,
|
||||||
reds->agent_file_xfer,
|
reds->agent_file_xfer, TRUE);
|
||||||
reds_use_client_monitors_config(reds), TRUE);
|
|
||||||
|
|
||||||
/* Throw away pending chunks from the current (if any) and future
|
/* Throw away pending chunks from the current (if any) and future
|
||||||
* messages read from the agent */
|
* 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) {
|
switch (state->vdi_chunk_header.port) {
|
||||||
case VDP_CLIENT_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);
|
buf->data, buf->len);
|
||||||
switch (res) {
|
switch (res) {
|
||||||
case AGENT_MSG_FILTER_OK:
|
case AGENT_MSG_FILTER_OK:
|
||||||
@ -1049,7 +1047,7 @@ void reds_on_main_agent_data(RedsState *reds, MainChannelClient *mcc, void *mess
|
|||||||
VDIChunkHeader *header;
|
VDIChunkHeader *header;
|
||||||
int res;
|
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);
|
message, size);
|
||||||
switch (res) {
|
switch (res) {
|
||||||
case AGENT_MSG_FILTER_OK:
|
case AGENT_MSG_FILTER_OK:
|
||||||
@ -3214,8 +3212,6 @@ SPICE_GNUC_VISIBLE int spice_server_add_interface(SpiceServer *s,
|
|||||||
red_dispatcher_init(qxl);
|
red_dispatcher_init(qxl);
|
||||||
dispatcher = qxl->st->dispatcher;
|
dispatcher = qxl->st->dispatcher;
|
||||||
reds->dispatchers = g_list_prepend(reds->dispatchers, 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
|
/* 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
|
* 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);
|
ring_init(&state->read_bufs);
|
||||||
agent_msg_filter_init(&state->write_filter, reds->agent_copypaste,
|
agent_msg_filter_init(&state->write_filter, reds->agent_copypaste,
|
||||||
reds->agent_file_xfer,
|
reds->agent_file_xfer, TRUE);
|
||||||
reds_use_client_monitors_config(reds), TRUE);
|
|
||||||
agent_msg_filter_init(&state->read_filter, reds->agent_copypaste,
|
agent_msg_filter_init(&state->read_filter, reds->agent_copypaste,
|
||||||
reds->agent_file_xfer,
|
reds->agent_file_xfer, TRUE);
|
||||||
reds_use_client_monitors_config(reds), TRUE);
|
|
||||||
|
|
||||||
state->read_state = VDI_PORT_READ_STATE_READ_HEADER;
|
state->read_state = VDI_PORT_READ_STATE_READ_HEADER;
|
||||||
state->receive_pos = (uint8_t *)&state->vdi_chunk_header;
|
state->receive_pos = (uint8_t *)&state->vdi_chunk_header;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user