Blame SOURCES/bz1688892-fix-openssl-init-failure.patch

6a7e4c
From aeec0e2cda5c440fdd3c5bea20ed7567bea540e1 Mon Sep 17 00:00:00 2001
6a7e4c
From: Quentin Armitage <quentin@armitage.org.uk>
6a7e4c
Date: Tue, 12 Mar 2019 14:58:38 +0000
6a7e4c
Subject: [PATCH 1/3] Fix OpenSSL init failure with OpenSSL v1.1.1
6a7e4c
6a7e4c
OpenSSL v1.1.1, but not v1.1.0h or v1.1.1b failed in SSL_CTX_new()
6a7e4c
if OPENSSL_init_crypto(OPENSSL_INIT_NO_LOAD_CONFIG) had previously
6a7e4c
been called.
6a7e4c
6a7e4c
This commit doesn't call OPENSSL_init_crypto() if doing so causes
6a7e4c
SSL_CTX_new() to fail.
6a7e4c
6a7e4c
Signed-off-by: Quentin Armitage <quentin@armitage.org.uk>
6a7e4c
---
6a7e4c
 configure.ac                 | 30 ++++++++++++++++++++++++++++++
6a7e4c
 keepalived/check/check_ssl.c |  6 ++++++
6a7e4c
 2 files changed, 36 insertions(+)
6a7e4c
6a7e4c
diff --git a/configure.ac b/configure.ac
6a7e4c
index 89399ca3..504b9b92 100644
6a7e4c
--- a/configure.ac
6a7e4c
+++ b/configure.ac
6a7e4c
@@ -819,6 +819,36 @@ AC_CHECK_FUNCS([SSL_set0_rbio OPENSSL_init_crypto])
6a7e4c
 # TLS_method() introduced OpenSSL v1.1.0
6a7e4c
 AC_CHECK_FUNCS([TLS_method])
6a7e4c
 
6a7e4c
+# In OpenSSL v1.1.1 the call to SSL_CTX_new() fails if OPENSSL_init_crypto() has been called with
6a7e4c
+# OPENSSL_INIT_NO_LOAD_CONFIG. It does not fail in v1.1.0h and v1.1.1b.
6a7e4c
+AS_IF([test .$ac_cv_func_OPENSSL_init_crypto = .yes -a .$ac_cv_func_TLS_method = .yes],
6a7e4c
+      [
6a7e4c
+	AC_RUN_IFELSE(
6a7e4c
+	  [AC_LANG_PROGRAM(
6a7e4c
+	    [[#include <openssl/ssl.h>]],
6a7e4c
+	    [[
6a7e4c
+	      const SSL_METHOD *meth;
6a7e4c
+	      SSL_CTX *ctx;
6a7e4c
+
6a7e4c
+	      if (!OPENSSL_init_crypto(OPENSSL_INIT_NO_LOAD_CONFIG, NULL))
6a7e4c
+		return 1;
6a7e4c
+
6a7e4c
+	      /* Initialize SSL context */
6a7e4c
+	      meth = TLS_method();
6a7e4c
+	      if (!(ctx = SSL_CTX_new(meth)))
6a7e4c
+		return 1;
6a7e4c
+	      return 0;
6a7e4c
+	    ]])],
6a7e4c
+	  [openssl_init_no_load_bug=0],
6a7e4c
+	  [openssl_init_no_load_bug=1],
6a7e4c
+	  [
6a7e4c
+	    AC_MSG_WARN([Cannot determine if need to OPENSSL_init_crypto() problem. Assuming yes for safety.])
6a7e4c
+	    openssl_init_no_load_bug=1
6a7e4c
+	  ]
6a7e4c
+	)
6a7e4c
+	AS_IF([test $openssl_init_no_load_bug -eq 1],
6a7e4c
+	      [AC_DEFINE([HAVE_OPENSSL_INIT_NO_LOAD_CONFIG_BUG], [ 1 ], [Define to 1 if OPENSSL_init_crypto(OPENSSL_INIT_NO_LOAD_CONFIG) bug)])])
6a7e4c
+      ])
6a7e4c
 unset LIBS
6a7e4c
 
6a7e4c
 if test $BUILD_GENHASH = No; then
6a7e4c
diff --git a/keepalived/check/check_ssl.c b/keepalived/check/check_ssl.c
6a7e4c
index 6bf6a005..2743ea87 100644
6a7e4c
--- a/keepalived/check/check_ssl.c
6a7e4c
+++ b/keepalived/check/check_ssl.c
6a7e4c
@@ -69,8 +69,14 @@ build_ssl_ctx(void)
6a7e4c
 
6a7e4c
 	/* Library initialization */
6a7e4c
 #if HAVE_OPENSSL_INIT_CRYPTO
6a7e4c
+#ifndef HAVE_OPENSSL_INIT_NO_LOAD_CONFIG_BUG
6a7e4c
+	/* In OpenSSL v1.1.1 if the following is called, SSL_CTX_new() below fails.
6a7e4c
+	 * It works in v1.1.0h and v1.1.1b.
6a7e4c
+	 * It transpires that it works without setting NO_LOAD_CONFIG, but it is
6a7e4c
+	 * presumably more efficient not to load it. */
6a7e4c
 	if (!OPENSSL_init_crypto(OPENSSL_INIT_NO_LOAD_CONFIG, NULL))
6a7e4c
 		log_message(LOG_INFO, "OPENSSL_init_crypto failed");
6a7e4c
+#endif
6a7e4c
 #else
6a7e4c
 	SSL_library_init();
6a7e4c
 	SSL_load_error_strings();
6a7e4c
-- 
6a7e4c
2.20.1
6a7e4c