diff options
author | Alon Levy <alevy@redhat.com> | 2011-03-04 13:15:26 +0200 |
---|---|---|
committer | Alon Levy <alevy@redhat.com> | 2011-03-08 21:18:55 +0200 |
commit | 61d8e54766e006418d9a3720a0256ac294ecb413 (patch) | |
tree | 38f7c4e9642a1566fce686402d27862870117d64 /server/reds.c | |
parent | 1af83642c14864b5cbbf6d2d7d92b9929789302d (diff) | |
download | spice-61d8e54766e006418d9a3720a0256ac294ecb413.tar.gz spice-61d8e54766e006418d9a3720a0256ac294ecb413.tar.xz spice-61d8e54766e006418d9a3720a0256ac294ecb413.zip |
server/reds: allow call to reds_agent_remove even if it is gone
The current assert(reds->agent_state.connected) tiggers if when
the agent disconnected there was still data waiting to be sent (for
instance if there is a bug in the client handling clipboard and it
is killed while a large clipboard transfer is in progress). So first
call to reds_agent_remove happens from spice_server_char_device_remove_interface,
and then it is called again (triggering the assert) from free_item_data
from read_from_vdi_port because of the channel destruction.
Other option would be to not call it from one of the paths - but that
is suboptimal:
* if there is no data in the pipe, the second call never happens.
* the second call has to be there anyway, because it may fail during
parsing data from the agent.
This patch fixes a segfault on this assert when a client starts passing
from guest agent to client a large clipboard and dies in the middle. There
is still another assert happening occasionally at marshaller which I don't
have a fix for (but it doesn't seem to be related).
Diffstat (limited to 'server/reds.c')
-rw-r--r-- | server/reds.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/server/reds.c b/server/reds.c index 750b785c..c1873efb 100644 --- a/server/reds.c +++ b/server/reds.c @@ -699,7 +699,9 @@ static void reds_agent_remove() SpiceCharDeviceInstance *sin = vdagent; SpiceCharDeviceInterface *sif; - ASSERT(reds->agent_state.connected) + if (!reds->agent_state.connected) { + return; + } reds->agent_state.connected = 0; vdagent = NULL; reds_update_mouse_mode(); |