[Spice-commits] client/red_channel.cpp

Arnon Gilboa agilboa at kemper.freedesktop.org
Tue Dec 7 04:34:38 PST 2010


 client/red_channel.cpp |   12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

New commits:
commit 8a7e6fef27a508c3aa22ddb0d79094cfa7735cb7
Author: Arnon Gilboa <agilboa at redhat.com>
Date:   Tue Dec 7 12:44:34 2010 +0200

    spicec: do not call connect_secure when connect_unsecure fails due to protocol version mismatch (v2)
    
    If connect_unsecure failed due to protocol version mismatch, don't try to
    connect_secure with the same version, but retry (connect_secure or
    connect_unsecure) with older version. catch (...) is handled by caller
    at RedChannel::run().
    
    This solves the following bug: when "new" Spice client (protocol version 2)
    with given secure_port connects to "old" server which is not using the same
    secure_port (or not using a secure_port at all), the client exits immediately.
    
    In this scenario, the client first tries to use Spice protocol version 2 to
    connect the unsecure port, and altough this fails due to version mismatch, it
    tries to connect to the secure port with the same protocol version 2, which is
    a wrong behavior, fails due to socket error 10061 (WSAECONNREFUSED -
    Connection refused) and handled mistakenly by immediate exit, instead of
    retrying with protocol version 1.

diff --git a/client/red_channel.cpp b/client/red_channel.cpp
index 273b28d..f4cdf52 100644
--- a/client/red_channel.cpp
+++ b/client/red_channel.cpp
@@ -217,8 +217,10 @@ void RedChannelBase::connect(const ConnectionOptions& options, uint32_t connecti
                 RedPeer::connect_unsecure(host, options.unsecure_port);
                 link(connection_id, password, protocol);
                 return;
-            } catch (...) {
-                if (!options.allow_secure()) {
+            } catch (Exception& e) {
+                // On protocol version mismatch, don't connect_secure with the same version
+                if (e.get_error_code() == SPICEC_ERROR_CODE_VERSION_MISMATCH ||
+                                                        !options.allow_secure()) {
                     throw;
                 }
                 RedPeer::close();
@@ -228,9 +230,9 @@ void RedChannelBase::connect(const ConnectionOptions& options, uint32_t connecti
         RedPeer::connect_secure(options, host);
         link(connection_id, password, protocol);
     } catch (Exception& e) {
-        if (protocol == 2 &&
-            options.protocol == 0 &&
-            e.get_error_code() == SPICEC_ERROR_CODE_VERSION_MISMATCH) {
+        // On protocol version mismatch, retry with older version
+        if (e.get_error_code() == SPICEC_ERROR_CODE_VERSION_MISMATCH &&
+                                 protocol == 2 && options.protocol == 0) {
             RedPeer::cleanup();
             protocol = 1;
             goto retry;


More information about the Spice-commits mailing list