From f4c467452694e1211395d17c2c027d99c35ee1e1 Mon Sep 17 00:00:00 2001 From: Tomas Mraz Date: Tue, 15 Oct 2024 11:18:24 +0200 Subject: [PATCH] Revert API change of OPENSSL_version() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There was an API change done as part of PR #24450. This patch reverts it. Fixes #25690 Reviewed-by: Saša Nedvědický Reviewed-by: Matt Caswell (Merged from https://github.com/openssl/openssl/pull/25692) --- apps/version.c | 21 +++++--------- crypto/cversion.c | 70 ++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 73 insertions(+), 18 deletions(-) diff --git a/apps/version.c b/apps/version.c index d4110c5e40..89fb64b70a 100644 --- a/apps/version.c +++ b/apps/version.c @@ -56,7 +56,6 @@ int version_main(int argc, char **argv) #endif char *prog; OPTION_CHOICE o; - const char *tmp; prog = opt_init(argc, argv, version_options); while ((o = opt_next()) != OPT_EOF) { @@ -134,18 +133,12 @@ opthelp: } if (cflags) printf("%s\n", OpenSSL_version(OPENSSL_CFLAGS)); - if (dir) { - tmp = OpenSSL_version(OPENSSL_DIR); - printf("OPENSSLDIR: %s\n", tmp == NULL ? "Undefined" : tmp); - } - if (engdir) { - tmp = OpenSSL_version(OPENSSL_ENGINES_DIR); - printf("ENGINESDIR: %s\n", tmp == NULL ? "Undefined" : tmp); - } - if (moddir) { - tmp = OpenSSL_version(OPENSSL_MODULES_DIR); - printf("MODULESDIR: %s\n", tmp == NULL ? "Undefined" : tmp); - } + if (dir) + printf("%s\n", OpenSSL_version(OPENSSL_DIR)); + if (engdir) + printf("%s\n", OpenSSL_version(OPENSSL_ENGINES_DIR)); + if (moddir) + printf("%s\n", OpenSSL_version(OPENSSL_MODULES_DIR)); if (seed) { const char *src = OPENSSL_info(OPENSSL_INFO_SEED_SOURCE); printf("Seeding source: %s\n", src ? src : "N/A"); @@ -154,7 +147,7 @@ opthelp: printf("%s\n", OpenSSL_version(OPENSSL_CPU_INFO)); #if defined(_WIN32) if (windows) - printf("OSSL_WINCTX: %s\n", OpenSSL_version(OPENSSL_WINCTX)); + printf("%s\n", OpenSSL_version(OPENSSL_WINCTX)); #endif ret = 0; end: diff --git a/crypto/cversion.c b/crypto/cversion.c index c0ff19f6b6..87154645b0 100644 --- a/crypto/cversion.c +++ b/crypto/cversion.c @@ -7,8 +7,12 @@ * https://www.openssl.org/source/license.html */ +#include +#include +#include "internal/e_os.h" #include "internal/cryptlib.h" #include "internal/common.h" +#include "internal/thread_once.h" #include "buildinf.h" @@ -44,8 +48,41 @@ const char *OPENSSL_version_build_metadata(void) extern char ossl_cpu_info_str[]; +#if defined(_WIN32) && defined(OSSL_WINCTX) +/* size: MAX_PATH + sizeof("OPENSSLDIR: \"\"") */ +static char openssldir[MAX_PATH + 15]; + +/* size: MAX_PATH + sizeof("ENGINESDIR: \"\"") */ +static char enginesdir[MAX_PATH + 15]; + +/* size: MAX_PATH + sizeof("MODULESDIR: \"\"") */ +static char modulesdir[MAX_PATH + 15]; + +static CRYPTO_ONCE version_strings_once = CRYPTO_ONCE_STATIC_INIT; + +DEFINE_RUN_ONCE_STATIC(version_strings_setup) +{ + BIO_snprintf(openssldir, sizeof(openssldir), "OPENSSLDIR: \"%s\"", + ossl_get_openssldir()); + BIO_snprintf(enginesdir, sizeof(enginesdir), "ENGINESDIR: \"%s\"", + ossl_get_enginesdir()); + BIO_snprintf(modulesdir, sizeof(modulesdir), "MODULESDIR: \"%s\"", + ossl_get_modulesdir()); + return 1; +} + +# define TOSTR(x) #x +# define OSSL_WINCTX_STRING "OSSL_WINCTX: \"" ## TOSTR(OSSL_WINCTX) ## "\"" + +#endif + const char *OpenSSL_version(int t) { +#if defined(_WIN32) && defined(OSSL_WINCTX) + /* Cannot really fail but we would return empty strings anyway */ + (void)RUN_ONCE(&version_strings_once, version_strings_setup); +#endif + switch (t) { case OPENSSL_VERSION: return OPENSSL_VERSION_TEXT; @@ -59,19 +96,44 @@ const char *OpenSSL_version(int t) return compiler_flags; case OPENSSL_PLATFORM: return PLATFORM; +#if defined(_WIN32) && defined(OSSL_WINCTX) case OPENSSL_DIR: - return ossl_get_openssldir(); + return openssldir; case OPENSSL_ENGINES_DIR: - return ossl_get_enginesdir(); + return enginesdir; case OPENSSL_MODULES_DIR: - return ossl_get_modulesdir(); + return modulesdir; +#else + case OPENSSL_DIR: +# ifdef OPENSSLDIR + return "OPENSSLDIR: \"" OPENSSLDIR "\""; +# else + return "OPENSSLDIR: N/A"; +# endif + case OPENSSL_ENGINES_DIR: +# ifdef ENGINESDIR + return "ENGINESDIR: \"" ENGINESDIR "\""; +# else + return "ENGINESDIR: N/A"; +# endif + case OPENSSL_MODULES_DIR: +# ifdef MODULESDIR + return "MODULESDIR: \"" MODULESDIR "\""; +# else + return "MODULESDIR: N/A"; +# endif +#endif case OPENSSL_CPU_INFO: if (OPENSSL_info(OPENSSL_INFO_CPU_SETTINGS) != NULL) return ossl_cpu_info_str; else return "CPUINFO: N/A"; case OPENSSL_WINCTX: - return ossl_get_wininstallcontext(); +#if defined(_WIN32) && defined(OSSL_WINCTX) + return OSSL_WINCTX_STRING; +#else + return "OSSL_WINCTX: Undefined"; +#endif } return "not available"; }