--- openssl-0.9.8zg/apps/openssl.c.~1~ 2015-06-12 12:12:46.077653324 +0300 +++ openssl-0.9.8zg/apps/openssl.c 2015-06-12 12:20:27.351934746 +0300 @@ -131,6 +131,10 @@ #include "s_apps.h" #include +/* Solaris OpenSSL */ +#include + + /* * The LHASH callbacks ("hash" & "cmp") have been replaced by functions with * the base prototypes (we cast each variable inside the function to the @@ -153,9 +157,10 @@ int in_FIPS_mode = 0; #endif +static int *modes; + static void lock_dbg_cb(int mode, int type, const char *file, int line) { - static int modes[CRYPTO_NUM_LOCKS]; /* = {0, 0, ... } */ const char *errstr = NULL; int rw; @@ -165,7 +170,7 @@ goto err; } - if (type < 0 || type >= CRYPTO_NUM_LOCKS) { + if (type < 0 || type >= CRYPTO_num_locks()) { errstr = "type out of bounds"; goto err; } @@ -227,19 +232,29 @@ in_FIPS_mode = 0; +/* + * Solaris OpenSSL + * Add a further check for the FIPS_mode_set() symbol before calling to + * allow openssl(1openssl) to be run against both fips and non-fips libraries. + */ if (getenv("OPENSSL_FIPS")) { -#ifdef OPENSSL_FIPS - if (!FIPS_mode_set(1)) { + int (*FIPS_mode_set)(int); + FIPS_mode_set = (int (*)(int)) dlsym(RTLD_NEXT, "FIPS_mode_set"); + + if (FIPS_mode_set != NULL) { + if (!(*FIPS_mode_set)(1)) { ERR_load_crypto_strings(); ERR_print_errors(BIO_new_fp(stderr, BIO_NOCLOSE)); EXIT(1); } in_FIPS_mode = 1; -#else - fprintf(stderr, "FIPS mode not supported.\n"); + } else { + fprintf(stderr, "Failed to enable FIPS mode. " + "For more information about running in FIPS mode see openssl(5).\n"); EXIT(1); -#endif + } } + if (bio_err == NULL) if ((bio_err = BIO_new(BIO_s_file())) != NULL) @@ -262,6 +277,14 @@ if (getenv("OPENSSL_DEBUG_LOCKING") != NULL) #endif { + modes = OPENSSL_malloc(CRYPTO_num_locks() * sizeof (int)); + if (modes == NULL) { + ERR_load_crypto_strings(); + BIO_printf(bio_err,"Memory allocation failure\n"); + ERR_print_errors(bio_err); + EXIT(1); + } + memset(modes, 0, CRYPTO_num_locks() * sizeof (int)); CRYPTO_set_locking_callback(lock_dbg_cb); } @@ -371,6 +394,7 @@ BIO_free(bio_err); bio_err = NULL; } + if (modes != NULL) OPENSSL_free(modes); OPENSSL_EXIT(ret); }