mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice
synced 2025-12-28 16:29:56 +00:00
server/spicevmc: Don't destroy the rcc twice
spicevmc calls red_channel_client_destroy() on the rcc when it disconnects
since we don't want to delay the destroy until the session gets closed as
spicevmc channels can be opened, closed and opened again during a single
session.
This causes red_channel_client_destroy() to get called twice, triggering
an assert, when a connected channel gets destroyed.
This was fixed with commit ffc4de01e6 for
the case where: a spicevmc channel was open on client disconnected, and
the main channel disconnect gets handled first.
But the channel can also be destroyed when the chardev gets unregistered
with the spice-server. This path still triggers the assert.
This patch fixes this by adding a destroying flag to the rcc struct, and
also moves the previous fix over to the same, more clean, method of
detecting this special case.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
parent
7e3fb815cc
commit
f3f8ebe91b
@ -780,6 +780,7 @@ void red_channel_set_data(RedChannel *channel, void *data)
|
||||
|
||||
void red_channel_client_destroy(RedChannelClient *rcc)
|
||||
{
|
||||
rcc->destroying = 1;
|
||||
if (red_channel_client_is_connected(rcc)) {
|
||||
red_channel_client_disconnect(rcc);
|
||||
}
|
||||
@ -1439,6 +1440,7 @@ void red_client_destroy(RedClient *client)
|
||||
// some channels may be in other threads, so disconnection
|
||||
// is not synchronous.
|
||||
rcc = SPICE_CONTAINEROF(link, RedChannelClient, client_link);
|
||||
rcc->destroying = 1;
|
||||
// some channels may be in other threads. However we currently
|
||||
// assume disconnect is synchronous (we changed the dispatcher
|
||||
// to wait for disconnection)
|
||||
|
||||
@ -255,6 +255,7 @@ struct RedChannelClient {
|
||||
|
||||
RedChannelCapabilities remote_caps;
|
||||
int is_mini_header;
|
||||
int destroying;
|
||||
};
|
||||
|
||||
struct RedChannel {
|
||||
|
||||
@ -116,9 +116,9 @@ static void spicevmc_red_channel_client_on_disconnect(RedChannelClient *rcc)
|
||||
sin = state->chardev_sin;
|
||||
sif = SPICE_CONTAINEROF(sin->base.sif, SpiceCharDeviceInterface, base);
|
||||
|
||||
/* Don't destroy the rcc if the entire client is disconnecting, as then
|
||||
red_client_destroy will already do this! */
|
||||
if (!rcc->client->disconnecting)
|
||||
/* Don't destroy the rcc if it is already being destroyed, as then
|
||||
red_client_destroy/red_channel_client_destroy will already do this! */
|
||||
if (!rcc->destroying)
|
||||
red_channel_client_destroy(rcc);
|
||||
|
||||
state->rcc = NULL;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user