diff options
author | Raimo Niskanen <[email protected]> | 2016-07-25 14:26:45 +0200 |
---|---|---|
committer | Raimo Niskanen <[email protected]> | 2016-07-25 14:29:35 +0200 |
commit | 825145898d7bf69147c1e6a6ad66c3454e7ec8f1 (patch) | |
tree | 0fb49da4d912ab0dd1eda8f492fabf8c78c3b444 /lib/ssl/src/ssl_handshake.erl | |
parent | 2ed9828f26e420543eefced8b8138c474694cd91 (diff) | |
parent | f5ef4087331c0181fd154dcaa372a05e6f8bd408 (diff) | |
download | otp-825145898d7bf69147c1e6a6ad66c3454e7ec8f1.tar.gz otp-825145898d7bf69147c1e6a6ad66c3454e7ec8f1.tar.bz2 otp-825145898d7bf69147c1e6a6ad66c3454e7ec8f1.zip |
Merge branch 'maint-18' into maint
Conflicts:
OTP_VERSION
erts/doc/src/notes.xml
erts/vsn.mk
lib/common_test/doc/src/notes.xml
lib/common_test/vsn.mk
lib/ssl/doc/src/notes.xml
lib/ssl/src/ssl.appup.src
lib/ssl/vsn.mk
lib/stdlib/test/ets_SUITE.erl
otp_versions.table
Diffstat (limited to 'lib/ssl/src/ssl_handshake.erl')
-rw-r--r-- | lib/ssl/src/ssl_handshake.erl | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/lib/ssl/src/ssl_handshake.erl b/lib/ssl/src/ssl_handshake.erl index bca341c8bc..47af1f861c 100644 --- a/lib/ssl/src/ssl_handshake.erl +++ b/lib/ssl/src/ssl_handshake.erl @@ -1305,8 +1305,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}; |