[Spice-devel] [PATCH spice 1/1] spicec: do not call connect_secure when connect_unsecure fails due to protocol version mismatch (v2)
Hans de Goede
hdegoede at redhat.com
Tue Dec 7 03:16:08 PST 2010
Ack.
On 12/07/2010 11:45 AM, Arnon Gilboa wrote:
> 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.
> ---
> 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 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-devel
mailing list