diff options
author | Arnon Gilboa <agilboa@redhat.com> | 2010-12-07 12:44:34 +0200 |
---|---|---|
committer | Arnon Gilboa <agilboa@redhat.com> | 2010-12-07 14:34:22 +0200 |
commit | 8a7e6fef27a508c3aa22ddb0d79094cfa7735cb7 (patch) | |
tree | 5c5d0153c3bd7ab3ed9552d078721f7cdecd706e /client/red_channel.cpp | |
parent | 9dfeeaefbe10163863192703ca35ac65e02bc0db (diff) | |
download | spice-8a7e6fef27a508c3aa22ddb0d79094cfa7735cb7.tar.gz spice-8a7e6fef27a508c3aa22ddb0d79094cfa7735cb7.tar.xz spice-8a7e6fef27a508c3aa22ddb0d79094cfa7735cb7.zip |
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.
Diffstat (limited to 'client/red_channel.cpp')
-rw-r--r-- | client/red_channel.cpp | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/client/red_channel.cpp b/client/red_channel.cpp index 273b28dd..f4cdf529 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; |