diff options
author | Erlang/OTP <[email protected]> | 2016-07-23 10:43:06 +0200 |
---|---|---|
committer | Erlang/OTP <[email protected]> | 2016-07-23 10:43:06 +0200 |
commit | 1b000935ff8b570398a360032feb099fe000d7e1 (patch) | |
tree | c94c059fbb5bc91dd37e33b28029f51dcf7a325f /lib/ssl/src/ssl_handshake.erl | |
parent | e59dd4708bdb7d868bf31da9d0a3024218f3f8f8 (diff) | |
parent | a138a928849f3b68a2542f2592e95e7362217e3d (diff) | |
download | otp-1b000935ff8b570398a360032feb099fe000d7e1.tar.gz otp-1b000935ff8b570398a360032feb099fe000d7e1.tar.bz2 otp-1b000935ff8b570398a360032feb099fe000d7e1.zip |
Merge branch 'raimo/ssl/version-selection/maint-18/OTP-13753' into maint-18
* raimo/ssl/version-selection/maint-18/OTP-13753:
Improve version selection
Diffstat (limited to 'lib/ssl/src/ssl_handshake.erl')
-rw-r--r-- | lib/ssl/src/ssl_handshake.erl | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/lib/ssl/src/ssl_handshake.erl b/lib/ssl/src/ssl_handshake.erl index 235d6efbb6..43b0c42f8d 100644 --- a/lib/ssl/src/ssl_handshake.erl +++ b/lib/ssl/src/ssl_handshake.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2013-2015. All Rights Reserved. +%% Copyright Ericsson AB 2013-2016. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. @@ -1258,8 +1258,40 @@ handle_server_hello_extensions(RecordCB, Random, CipherSuite, Compression, end. select_version(RecordCB, ClientVersion, Versions) -> - ServerVersion = RecordCB:highest_protocol_version(Versions), - RecordCB:lowest_protocol_version(ClientVersion, ServerVersion). + do_select_version(RecordCB, ClientVersion, Versions). + +do_select_version(_, ClientVersion, []) -> + ClientVersion; +do_select_version(RecordCB, ClientVersion, [Version | Versions]) -> + case RecordCB:is_higher(Version, ClientVersion) of + true -> + %% Version too high for client - keep looking + do_select_version(RecordCB, ClientVersion, Versions); + false -> + %% Version ok for client - look for a higher + do_select_version(RecordCB, ClientVersion, Versions, Version) + end. +%% +do_select_version(_, _, [], GoodVersion) -> + GoodVersion; +do_select_version( + RecordCB, ClientVersion, [Version | Versions], GoodVersion) -> + BetterVersion = + case RecordCB:is_higher(Version, ClientVersion) of + true -> + %% Version too high for client + GoodVersion; + false -> + %% Version ok for client + case RecordCB:is_higher(Version, GoodVersion) of + true -> + %% Use higher version + Version; + false -> + GoodVersion + end + end, + do_select_version(RecordCB, ClientVersion, Versions, BetterVersion). renegotiation_info(_, client, _, false) -> #renegotiation_info{renegotiated_connection = undefined}; |