]> git.ipfire.org Git - thirdparty/openvpn.git/commitdiff
Undo cipher push in client options state if cipher is rejected
authorSteffan Karger <steffan@karger.me>
Tue, 27 Jun 2017 22:20:29 +0000 (00:20 +0200)
committerGert Doering <gert@greenie.muc.de>
Thu, 29 Jun 2017 18:34:56 +0000 (20:34 +0200)
Because of the way we re-use the options parser for both config files and
pushed options, we always update the local options state when we accept an
option.  This resulted in a pushed cipher being rejected the first time it
was pushed, but being accepted the second time.

This patch is a minimal way to resolve this issue in the master and
release/2.4 branches.  I'll send a more invasive patch for master, to
reset the entire options state on reconnects, later.

Trac: #906

Signed-off-by: Steffan Karger <steffan@karger.me>
Acked-by: Arne Schwabe <arne@rfc2549.org>
Acked-by: Gert Doering <gert@greenie.muc.de>
Message-Id: <20170627222029.26623-1-steffan@karger.me>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg14984.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
(cherry picked from commit 3be9a1c1cd75627c30dca05bed28c84ad4dc1d37)

src/openvpn/ssl.c
src/openvpn/ssl.h

index 98f4741bddc49d2619612af8ded21c3b0f01b208..cad9ce737156b5739456b93359fbbf029b84a86d 100644 (file)
@@ -1960,7 +1960,7 @@ cleanup:
 
 bool
 tls_session_update_crypto_params(struct tls_session *session,
-                                 const struct options *options, struct frame *frame)
+                                 struct options *options, struct frame *frame)
 {
     if (!session->opt->server
         && 0 != strcmp(options->ciphername, session->opt->config_ciphername)
@@ -1969,6 +1969,8 @@ tls_session_update_crypto_params(struct tls_session *session,
         msg(D_TLS_ERRORS, "Error: pushed cipher not allowed - %s not in %s or %s",
             options->ciphername, session->opt->config_ciphername,
             options->ncp_ciphers);
+        /* undo cipher push, abort connection setup */
+        options->ciphername = session->opt->config_ciphername;
         return false;
     }
 
index 56ea601372e9de941a19b5ab0c3bd0a73c65a519..0e0f68fa36c748b452cebabcb03e52da1322181f 100644 (file)
@@ -481,7 +481,7 @@ void tls_update_remote_addr(struct tls_multi *multi,
  * @return true if updating succeeded, false otherwise.
  */
 bool tls_session_update_crypto_params(struct tls_session *session,
-                                      const struct options *options, struct frame *frame);
+                                      struct options *options, struct frame *frame);
 
 /**
  * "Poor man's NCP": Use peer cipher if it is an allowed (NCP) cipher.