Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:15.2:PowerPC
virt-viewer
c2dabf07-Fix-a-regression-when-initial-connecti...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File c2dabf07-Fix-a-regression-when-initial-connection-fails.patch of Package virt-viewer
Subject: Fix a regression when initial connection fails From: Jonathon Jongsma jjongsma@redhat.com Tue Jan 29 14:47:51 2019 -0600 Date: Tue Apr 16 15:19:51 2019 -0500: Git: c2dabf0730e1601745d2cdfc28f59e65e17cdab1 Due to changes in commit 65ef66e4, when the initial connection fails, virt-viewer just sat quietly and didn't indicate what was wrong. It also did not exit as it did before. This is because we were using virt_viewer_session_spice_channel_destroy() incorrectly. This function was intended to be a callback that is called to clean up the VV session when the SpiceSession tells us that a channel has been destroyed. It does not actually destroy the channel, it only cleans up references to that channel within virt-viewer. After calling this function, the channel is not affected in any way. If the channel object was valid before calling the function, it will be valid and unchanged after calling the function as well. The problem is that before commit 65ef66e4, this function (_channel_destroy()) also had a side-effect of emitting a signal that made us think that the SpiceSession was disconnected when it was not. The application responded to this signal by exiting even though the session was not properly disconnected and cleaned up. We now no longer exit the application until the SpiceSession is properly disconnected and cleaned up. So we need to make sure that this happens when our initial connection fails. Therefore, when the main channel receives an error channel-event, we should not call virt_viewer_session_spice_channel_destroy(). This function should only be called when a channel has actually been destroyed, and the channel is not destroyed at this point. We should instead explicitly disconnect the session, which will result in the channels being destroyed properly. After the session destroys all of the channels, the 'channel-destroy' signal will be emitted by SpiceSession, so the _channel_destroy() function will eventually get called by the signal handler. To make the proper use of the function more obvious, I also changed the function name from _channel_destroy() to _channel_destroyed() and added a comment. Fixes: rhbz#1666869 Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com> Acked-by: Christophe Fergeau <cfergeau@redhat.com> Index: virt-viewer-8.0/src/virt-viewer-session-spice.c =================================================================== --- virt-viewer-8.0.orig/src/virt-viewer-session-spice.c +++ virt-viewer-8.0/src/virt-viewer-session-spice.c @@ -78,9 +78,9 @@ static void virt_viewer_session_spice_us static void virt_viewer_session_spice_channel_new(SpiceSession *s, SpiceChannel *channel, VirtViewerSession *session); -static void virt_viewer_session_spice_channel_destroy(SpiceSession *s, - SpiceChannel *channel, - VirtViewerSession *session); +static void virt_viewer_session_spice_channel_destroyed(SpiceSession *s, + SpiceChannel *channel, + VirtViewerSession *session); static void virt_viewer_session_spice_session_disconnected(SpiceSession *s, VirtViewerSessionSpice *session); static void virt_viewer_session_spice_smartcard_insert(VirtViewerSession *session); @@ -406,7 +406,7 @@ create_spice_session(VirtViewerSessionSp virt_viewer_signal_connect_object(self->priv->session, "channel-new", G_CALLBACK(virt_viewer_session_spice_channel_new), self, 0); virt_viewer_signal_connect_object(self->priv->session, "channel-destroy", - G_CALLBACK(virt_viewer_session_spice_channel_destroy), self, 0); + G_CALLBACK(virt_viewer_session_spice_channel_destroyed), self, 0); virt_viewer_signal_connect_object(self->priv->session, "disconnected", G_CALLBACK(virt_viewer_session_spice_session_disconnected), self, 0); @@ -785,14 +785,14 @@ virt_viewer_session_spice_main_channel_e spice_session_connect(self->priv->session); } } else { - virt_viewer_session_spice_channel_destroy(NULL, channel, session); + spice_session_disconnect(self->priv->session); } break; } case SPICE_CHANNEL_ERROR_IO: case SPICE_CHANNEL_ERROR_LINK: case SPICE_CHANNEL_ERROR_TLS: - virt_viewer_session_spice_channel_destroy(NULL, channel, session); + spice_session_disconnect(self->priv->session); break; default: g_warning("unhandled spice main channel event: %u", event); @@ -1327,10 +1327,11 @@ virt_viewer_session_spice_session_discon g_signal_emit_by_name(self, "session-disconnected", error ? error->message : NULL); } +/* called when the spice session indicates that a session has been destroyed */ static void -virt_viewer_session_spice_channel_destroy(G_GNUC_UNUSED SpiceSession *s, - SpiceChannel *channel, - VirtViewerSession *session) +virt_viewer_session_spice_channel_destroyed(G_GNUC_UNUSED SpiceSession *s, + SpiceChannel *channel, + VirtViewerSession *session) { VirtViewerSessionSpice *self = VIRT_VIEWER_SESSION_SPICE(session); int id;
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor