X-Git-Url: https://git.openssl.org/gitweb/?a=blobdiff_plain;f=apps%2Fopenssl.c;h=1c880d90ba1d142416ca8d1cbd16668be0a8aec8;hb=fc90e42c8623af13308d8ef7e7ada84af0a36509;hp=950c9c8bf281c9427a23a3669b565f295b1cb389;hpb=8ecef24a6607fef55101bdc06bddf1fe2a2e4c51;p=openssl.git diff --git a/apps/openssl.c b/apps/openssl.c index 950c9c8bf2..1c880d90ba 100644 --- a/apps/openssl.c +++ b/apps/openssl.c @@ -129,6 +129,9 @@ #include "progs.h" #include "s_apps.h" #include +#ifdef OPENSSL_FIPS +#include +#endif /* The LHASH callbacks ("hash" & "cmp") have been replaced by functions with the * base prototypes (we cast each variable inside the function to the required @@ -212,8 +215,13 @@ static void lock_dbg_cb(int mode, int type, const char *file, int line) } } +#if defined( OPENSSL_SYS_VMS) && (__INITIAL_POINTER_SIZE == 64) +# define ARGV _Argv +#else +# define ARGV Argv +#endif -int main(int Argc, char *_Argv[]) +int main(int Argc, char *ARGV[]) { ARGS arg; #define PROG_NAME_SIZE 39 @@ -228,25 +236,33 @@ int main(int Argc, char *_Argv[]) LHASH_OF(FUNCTION) *prog=NULL; long errline; -#if defined( OPENSSL_SYS_VMS) && !defined( VMS_TRUST_ARGV) - /* 2011-03-08 SMS. - * "HP C V7.3-009 on OpenVMS Alpha V8.3" with 64-bit - * pointers (at least) may not NULL-terminate argv[] - * as expected. If necessary, use a (properly) - * NULL-terminated duplicate of argv[]. - */ - /* 2011-03-20 RL. - * Additionally, when the argument vector is full of - * 32-bit pointers and we have a 64-bit pointer size - * everywhere else, we need to make a copy of it using - * 64-bit pointers. Hence the odd conditinal. +#if defined( OPENSSL_SYS_VMS) && (__INITIAL_POINTER_SIZE == 64) + /* 2011-03-22 SMS. + * If we have 32-bit pointers everywhere, then we're safe, and + * we bypass this mess, as on non-VMS systems. (See ARGV, + * above.) + * Problem 1: Compaq/HP C before V7.3 always used 32-bit + * pointers for argv[]. + * Fix 1: For a 32-bit argv[], when we're using 64-bit pointers + * everywhere else, we always allocate and use a 64-bit + * duplicate of argv[]. + * Problem 2: Compaq/HP C V7.3 (Alpha, IA64) before ECO1 failed + * to NULL-terminate a 64-bit argv[]. (As this was written, the + * compiler ECO was available only on IA64.) + * Fix 2: Unless advised not to (VMS_TRUST_ARGV), we test a + * 64-bit argv[argc] for NULL, and, if necessary, use a + * (properly) NULL-terminated (64-bit) duplicate of argv[]. + * The same code is used in either case to duplicate argv[]. + * Some of these decisions could be handled in preprocessing, + * but the code tends to get even uglier, and the penalty for + * deciding at compile- or run-time is tiny. */ char **Argv = NULL; int free_Argv = 0; - if (_Argv[ Argc] != NULL -# if defined(__INITIAL_POINTER_SIZE) - || sizeof(_Argv) < (__INITIAL_POINTER_SIZE / 8) + if ((sizeof( _Argv) < 8) /* 32-bit argv[]. */ +# if !defined( VMS_TRUST_ARGV) + || (_Argv[ Argc] != NULL) /* Untrusted argv[argc] not NULL. */ # endif ) { @@ -256,24 +272,17 @@ int main(int Argc, char *_Argv[]) { ret = -1; goto end; } for(i = 0; i < Argc; i++) Argv[i] = _Argv[i]; - Argv[ Argc] = NULL; + Argv[ Argc] = NULL; /* Certain NULL termination. */ free_Argv = 1; } else { - /* 2011-03-20 RL. - * If we didn't copy the argument vector, then simply - * assign our variable. This will never happen when - * the argument vector pointer size was smaller than - * the initial pointer size, so even if the case might - * look unsafe, it isn't, it's just there to shut the - * compiler up. - */ + /* Use the known-good 32-bit argv[] (which needs the + * type cast to satisfy the compiler), or the trusted or + * tested-good 64-bit argv[] as-is. */ Argv = (char **)_Argv; } -#else - char **Argv = _Argv; -#endif +#endif /* defined( OPENSSL_SYS_VMS) && (__INITIAL_POINTER_SIZE == 64) */ arg.data=NULL; arg.count=0; @@ -304,6 +313,19 @@ int main(int Argc, char *_Argv[]) CRYPTO_set_locking_callback(lock_dbg_cb); } + if(getenv("OPENSSL_FIPS")) { +#ifdef OPENSSL_FIPS + if (!FIPS_mode_set(1)) { + ERR_load_crypto_strings(); + ERR_print_errors(BIO_new_fp(stderr,BIO_NOCLOSE)); + EXIT(1); + } +#else + fprintf(stderr, "FIPS mode not supported.\n"); + EXIT(1); +#endif + } + apps_startup(); /* Lets load up our environment a little */ @@ -420,7 +442,7 @@ end: BIO_free(bio_err); bio_err=NULL; } -#if defined( OPENSSL_SYS_VMS) && !defined( VMS_TRUST_ARGV) +#if defined( OPENSSL_SYS_VMS) && (__INITIAL_POINTER_SIZE == 64) /* Free any duplicate Argv[] storage. */ if (free_Argv) {