This patch changes the registration of the following keywords to be
unconditional:
  - ssl-dh-param-file
  - ssl-engine
  - ssl-propquery, ssl-provider, ssl-provider-path
  - ssl-default-bind-curves, ssl-default-server-curves
  - ssl-default-bind-sigalgs, ssl-default-server-sigalgs
  - ssl-default-bind-client-sigalgs, ssl-default-server-client-sigalgs

Instead of excluding them from the build, their parsing functions now
check for the required feature support. If the feature is missing, a
specific error message is returned, explaining that the SSL library
doesn't support it or that HAProxy was compiled with a flag disabling it.

This addresses issue https://github.com/haproxy/haproxy/issues/3246.
---
 src/cfgparse-ssl.c | 65 ++++++++++++++++++++++++++++------------------
 1 file changed, 40 insertions(+), 25 deletions(-)

diff --git a/src/cfgparse-ssl.c b/src/cfgparse-ssl.c
index 660f88b42..cc6d17a60 100644
--- a/src/cfgparse-ssl.c
+++ b/src/cfgparse-ssl.c
@@ -143,7 +143,6 @@ static int ssl_parse_global_ssl_async(char **args, int 
section_type, struct prox
 #endif
 }
 
-#if defined(USE_ENGINE) && !defined(OPENSSL_NO_ENGINE)
 /* parse the "ssl-engine" keyword in global section.
  * Returns <0 on alert, >0 on warning, 0 on success.
  */
@@ -151,6 +150,7 @@ static int ssl_parse_global_ssl_engine(char **args, int 
section_type, struct pro
                                        const struct proxy *defpx, const char 
*file, int line,
                                        char **err)
 {
+#if defined(USE_ENGINE) && !defined(OPENSSL_NO_ENGINE)
        char *algo;
        int ret = -1;
 
@@ -184,10 +184,12 @@ static int ssl_parse_global_ssl_engine(char **args, int 
section_type, struct pro
        }
        free(algo);
        return ret;
-}
+#else
+       memprintf(err, "'%s' is not supported (compiled without USE_ENGINE or 
with OPENSSL_NO_ENGINE).", args[0]);
+       return -1;
 #endif
+}
 
-#ifdef HAVE_SSL_PROVIDERS
 /* parse the "ssl-propquery" keyword in global section.
  * Returns <0 on alert, >0 on warning, 0 on success.
  */
@@ -195,6 +197,7 @@ static int ssl_parse_global_ssl_propquery(char **args, int 
section_type, struct
                                          const struct proxy *defpx, const char 
*file, int line,
                                          char **err)
 {
+#ifdef HAVE_SSL_PROVIDERS
        int ret = -1;
 
        if (*(args[1]) == 0) {
@@ -206,6 +209,10 @@ static int ssl_parse_global_ssl_propquery(char **args, int 
section_type, struct
                ret = 0;
 
        return ret;
+#else
+       memprintf(err, "'%s' is not supported (compiled without 
HAVE_SSL_PROVIDERS).", args[0]);
+       return -1;
+#endif
 }
 
 /* parse the "ssl-provider" keyword in global section.
@@ -215,6 +222,7 @@ static int ssl_parse_global_ssl_provider(char **args, int 
section_type, struct p
                                         const struct proxy *defpx, const char 
*file, int line,
                                         char **err)
 {
+#ifdef HAVE_SSL_PROVIDERS
        int ret = -1;
 
        if (*(args[1]) == 0) {
@@ -226,6 +234,10 @@ static int ssl_parse_global_ssl_provider(char **args, int 
section_type, struct p
                ret = 0;
 
        return ret;
+#else
+       memprintf(err, "'%s' is not supported (compiled without 
HAVE_SSL_PROVIDERS).", args[0]);
+       return -1;
+#endif
 }
 
 /* parse the "ssl-provider-path" keyword in global section.
@@ -235,6 +247,7 @@ static int ssl_parse_global_ssl_provider_path(char **args, 
int section_type, str
                                              const struct proxy *defpx, const 
char *file, int line,
                                              char **err)
 {
+#ifdef HAVE_SSL_PROVIDERS
        if (*(args[1]) == 0) {
                memprintf(err, "global statement '%s' expects a directory path 
as an argument.", args[0]);
                return -1;
@@ -243,8 +256,11 @@ static int ssl_parse_global_ssl_provider_path(char **args, 
int section_type, str
        OSSL_PROVIDER_set_default_search_path(NULL, args[1]);
 
        return 0;
-}
+#else
+       memprintf(err, "'%s' is not supported (compiled without 
HAVE_SSL_PROVIDERS).", args[0]);
+       return -1;
 #endif
+}
 
 /* parse the "ssl-default-bind-ciphers" / "ssl-default-server-ciphers" keywords
  * in global section. Returns <0 on alert, >0 on warning, 0 on success.
@@ -300,7 +316,6 @@ static int ssl_parse_global_ciphersuites(char **args, int 
section_type, struct p
 #endif
 }
 
-#if defined(SSL_CTX_set1_curves_list)
 /*
  * parse the "ssl-default-bind-curves" keyword in a global section.
  * Returns <0 on alert, >0 on warning, 0 on success.
@@ -309,6 +324,7 @@ static int ssl_parse_global_curves(char **args, int 
section_type, struct proxy *
                                    const struct proxy *defpx, const char 
*file, int line,
                                   char **err)
 {
+#if defined(SSL_CTX_set1_curves_list)
        char **target;
        target = (args[0][12] == 'b') ? &global_ssl.listen_default_curves : 
&global_ssl.connect_default_curves;
 
@@ -323,10 +339,12 @@ static int ssl_parse_global_curves(char **args, int 
section_type, struct proxy *
        free(*target);
        *target = strdup(args[1]);
        return 0;
-}
+#else
+       memprintf(err, "'%s' is not supported (compiled without 
SSL_CTX_set1_curves_list).", args[0]);
+       return -1;
 #endif
+}
 
-#if defined(SSL_CTX_set1_sigalgs_list)
 /*
  * parse the "ssl-default-bind-sigalgs" and "ssl-default-server-sigalgs" 
keyword in a global section.
  * Returns <0 on alert, >0 on warning, 0 on success.
@@ -335,6 +353,7 @@ static int ssl_parse_global_sigalgs(char **args, int 
section_type, struct proxy
                                    const struct proxy *defpx, const char 
*file, int line,
                                   char **err)
 {
+#if defined(SSL_CTX_set1_sigalgs_list)
        char **target;
 
        target = (args[0][12] == 'b') ? &global_ssl.listen_default_sigalgs : 
&global_ssl.connect_default_sigalgs;
@@ -350,10 +369,12 @@ static int ssl_parse_global_sigalgs(char **args, int 
section_type, struct proxy
        free(*target);
        *target = strdup(args[1]);
        return 0;
-}
+#else
+       memprintf(err, "'%s' is not supported (compiled without 
SSL_CTX_set1_sigalgs_list).", args[0]);
+       return -1;
 #endif
+}
 
-#if defined(SSL_CTX_set1_client_sigalgs_list)
 /*
  * parse the "ssl-default-bind-client-sigalgs" keyword in a global section.
  * Returns <0 on alert, >0 on warning, 0 on success.
@@ -362,6 +383,7 @@ static int ssl_parse_global_client_sigalgs(char **args, int 
section_type, struct
                                    const struct proxy *defpx, const char 
*file, int line,
                                   char **err)
 {
+#if defined(SSL_CTX_set1_client_sigalgs_list)
        char **target;
 
        target = (args[0][12] == 'b') ? 
&global_ssl.listen_default_client_sigalgs : 
&global_ssl.connect_default_client_sigalgs;
@@ -377,8 +399,11 @@ static int ssl_parse_global_client_sigalgs(char **args, 
int section_type, struct
        free(*target);
        *target = strdup(args[1]);
        return 0;
-}
+#else
+       memprintf(err, "'%s' is not supported (compiled without 
SSL_CTX_set1_client_sigalgs_list).", args[0]);
+       return -1;
 #endif
+}
 
 /* parse various global tune.ssl settings consisting in positive integers.
  * Returns <0 on alert, >0 on warning, 0 on success.
@@ -575,7 +600,6 @@ static int ssl_parse_global_lifetime(char **args, int 
section_type, struct proxy
        return 0;
 }
 
-#ifndef OPENSSL_NO_DH
 /* parse "ssl-dh-param-file".
  * Returns <0 on alert, >0 on warning, 0 on success.
  */
@@ -583,6 +607,7 @@ static int ssl_parse_global_dh_param_file(char **args, int 
section_type, struct
                                        const struct proxy *defpx, const char 
*file, int line,
                                        char **err)
 {
+#ifndef OPENSSL_NO_DH
        if (too_many_args(1, args, err, NULL))
                return -1;
 
@@ -596,9 +621,11 @@ static int ssl_parse_global_dh_param_file(char **args, int 
section_type, struct
                return -1;
        }
        return 0;
-}
-
+#else
+       memprintf(err, "'%s' is not supported by this SSL library (compiled 
with OPENSSL_NO_DH).", args[0]);
+       return -1;
 #endif
+}
 
 /* parse "ssl.default-dh-param".
  * Returns <0 on alert, >0 on warning, 0 on success.
@@ -2774,18 +2801,12 @@ static struct cfg_kw_list cfg_kws = {ILH, {
        { CFG_GLOBAL, "maxsslconn", ssl_parse_global_int },
        { CFG_GLOBAL, "ssl-default-bind-options", 
ssl_parse_default_bind_options },
        { CFG_GLOBAL, "ssl-default-server-options", 
ssl_parse_default_server_options },
-#ifndef OPENSSL_NO_DH
        { CFG_GLOBAL, "ssl-dh-param-file", ssl_parse_global_dh_param_file },
-#endif
        { CFG_GLOBAL, "ssl-mode-async",  ssl_parse_global_ssl_async },
-#if defined(USE_ENGINE) && !defined(OPENSSL_NO_ENGINE)
        { CFG_GLOBAL, "ssl-engine",  ssl_parse_global_ssl_engine },
-#endif
-#ifdef HAVE_SSL_PROVIDERS
        { CFG_GLOBAL, "ssl-propquery",  ssl_parse_global_ssl_propquery },
        { CFG_GLOBAL, "ssl-provider",  ssl_parse_global_ssl_provider },
        { CFG_GLOBAL, "ssl-provider-path",  ssl_parse_global_ssl_provider_path 
},
-#endif
        { CFG_GLOBAL, "ssl-security-level", ssl_parse_security_level },
        { CFG_GLOBAL, "ssl-skip-self-issued-ca", ssl_parse_skip_self_issued_ca 
},
        { CFG_GLOBAL, "tune.ssl.cachesize", ssl_parse_global_int },
@@ -2801,18 +2822,12 @@ static struct cfg_kw_list cfg_kws = {ILH, {
        { CFG_GLOBAL, "tune.ssl.keylog", ssl_parse_global_keylog },
        { CFG_GLOBAL, "ssl-default-bind-ciphers", ssl_parse_global_ciphers },
        { CFG_GLOBAL, "ssl-default-server-ciphers", ssl_parse_global_ciphers },
-#if defined(SSL_CTX_set1_curves_list)
        { CFG_GLOBAL, "ssl-default-bind-curves", ssl_parse_global_curves },
        { CFG_GLOBAL, "ssl-default-server-curves", ssl_parse_global_curves },
-#endif
-#if defined(SSL_CTX_set1_sigalgs_list)
        { CFG_GLOBAL, "ssl-default-bind-sigalgs", ssl_parse_global_sigalgs },
        { CFG_GLOBAL, "ssl-default-server-sigalgs", ssl_parse_global_sigalgs },
-#endif
-#if defined(SSL_CTX_set1_client_sigalgs_list)
        { CFG_GLOBAL, "ssl-default-bind-client-sigalgs", 
ssl_parse_global_client_sigalgs },
        { CFG_GLOBAL, "ssl-default-server-client-sigalgs", 
ssl_parse_global_client_sigalgs },
-#endif
        { CFG_GLOBAL, "ssl-default-bind-ciphersuites", 
ssl_parse_global_ciphersuites },
        { CFG_GLOBAL, "ssl-default-server-ciphersuites", 
ssl_parse_global_ciphersuites },
        { CFG_GLOBAL, "ssl-load-extra-files", ssl_parse_global_extra_files },
-- 
2.48.1



Reply via email to