summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnon Gilboa <agilboa@redhat.com>2010-12-07 12:44:34 +0200
committerHans de Goede <hdegoede@redhat.com>2010-12-16 16:22:08 +0100
commit9ca2be9047d9f8efb31b238c68fc5426a22ee462 (patch)
tree7d8aada4c55b1e83cee4e09025bccc27dc70e19c
parentc1880e8f322f98ae2bd0186c210531d8f8282b28 (diff)
downloadspice-9ca2be9047d9f8efb31b238c68fc5426a22ee462.tar.gz
spice-9ca2be9047d9f8efb31b238c68fc5426a22ee462.tar.xz
spice-9ca2be9047d9f8efb31b238c68fc5426a22ee462.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.
-rw-r--r--client/red_channel.cpp12
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;