[Spice-devel] [PATCH spice-server 07/10] red_channel: call reds_stream_free only after all the channel_client fields have been reset
Yonit Halperin
yhalperi at redhat.com
Wed May 8 07:06:22 PDT 2013
---
server/red_channel.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/server/red_channel.c b/server/red_channel.c
index 9d71543..7fde50d 100644
--- a/server/red_channel.c
+++ b/server/red_channel.c
@@ -1680,6 +1680,7 @@ static void red_channel_client_disconnect_dummy(RedChannelClient *rcc)
void red_channel_client_disconnect(RedChannelClient *rcc)
{
+ RedsStream *stream;
spice_printerr("%p (channel %p type %d id %d)", rcc, rcc->channel,
rcc->channel->type, rcc->channel->id);
if (rcc->dummy) {
@@ -1694,14 +1695,19 @@ void red_channel_client_disconnect(RedChannelClient *rcc)
rcc->channel->core->watch_remove(rcc->stream->watch);
rcc->stream->watch = NULL;
}
- reds_stream_free(rcc->stream);
- rcc->stream = NULL;
if (rcc->latency_monitor.timer) {
rcc->channel->core->timer_remove(rcc->latency_monitor.timer);
rcc->latency_monitor.timer = NULL;
}
red_channel_remove_client(rcc);
rcc->channel->channel_cbs.on_disconnect(rcc);
+ stream = rcc->stream;
+ rcc->stream = NULL;
+ /* reds_stream_free can lead to the whole client disconnection
+ * (see reds_handle_channel_event).
+ * We set stream = NULL before closing the stream, to avoid
+ * double release, if red_channel_client_disconnect is called again */
+ reds_stream_free(stream);
}
void red_channel_disconnect(RedChannel *channel)
--
1.8.1.4
More information about the Spice-devel
mailing list