From 087ca80ad83071dde0bb6bc1c28c743caa00eaf8 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 30 Mar 2016 08:35:18 +0200 Subject: [PATCH] Fix pointer size issues with argv on VMS The argument 'argv' in 'main' is a short pointer to a short pointer on VMS, regardless of initial pointer size. We must therefore make sure that 'copy_argv' gets a 32-bit pointer for argv, and that the copied argv is used for the rest of main(). This introduces the local type argv_t, which will have correct pointer size in all cases (and be harmless on all other platforms) as well as the macro Argv, which is defined as 'copied_argv' or 'argv', as the case may be. Reviewed-by: Andy Polyakov --- apps/apps.h | 11 +++++++++++ apps/openssl.c | 21 ++++++++++----------- apps/vms_decc_init.c | 3 ++- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/apps/apps.h b/apps/apps.h index fc480e16c8..7cf0dc4b6a 100644 --- a/apps/apps.h +++ b/apps/apps.h @@ -445,6 +445,17 @@ typedef struct args_st { char **argv; } ARGS; +#if defined(OPENSSL_SYS_VMS) && defined(__DECC) +# pragma pointer_size save +# pragma pointer_size 32 +typedef char **argv_t; +# pragma pointer_size restore +char **copy_argv(int *argc, argv_t argv); +#else +typedef char **argv_t; +#endif + + # define PW_MIN_LENGTH 4 typedef struct pw_cb_data { const void *password; diff --git a/apps/openssl.c b/apps/openssl.c index 2d9ddaa56b..166c7a1e45 100644 --- a/apps/openssl.c +++ b/apps/openssl.c @@ -207,15 +207,12 @@ static char *make_config_name() return p; } -#if defined( OPENSSL_SYS_VMS) -extern char **copy_argv(int *argc, char **argv); -#endif - int main(int argc, char *argv[]) { FUNCTION f, *fp; LHASH_OF(FUNCTION) *prog = NULL; char **copied_argv = NULL; + char **argv_alias = NULL; char *p, *pname; char buf[1024]; const char *prompt; @@ -231,8 +228,10 @@ int main(int argc, char *argv[]) bio_out = dup_bio_out(FORMAT_TEXT); bio_err = dup_bio_err(FORMAT_TEXT); -#if defined( OPENSSL_SYS_VMS) - copied_argv = argv = copy_argv(&argc, argv); +#if defined( OPENSSL_SYS_VMS) && defined(__DECC) + copied_argv = argv_alias = copy_argv(&argc, argv); +#else + argv_alias = argv; #endif p = getenv("OPENSSL_DEBUG_MEMORY"); @@ -256,22 +255,22 @@ int main(int argc, char *argv[]) goto end; prog = prog_init(); - pname = opt_progname(argv[0]); + pname = opt_progname(argv_alias[0]); /* first check the program name */ f.name = pname; fp = lh_FUNCTION_retrieve(prog, &f); if (fp != NULL) { - argv[0] = pname; - ret = fp->func(argc, argv); + argv_alias[0] = pname; + ret = fp->func(argc, argv_alias); goto end; } /* If there is stuff on the command line, run with that. */ if (argc != 1) { argc--; - argv++; - ret = do_cmd(prog, argc, argv); + argv_alias++; + ret = do_cmd(prog, argc, argv_alias); if (ret < 0) ret = 0; goto end; diff --git a/apps/vms_decc_init.c b/apps/vms_decc_init.c index b66c00ffd1..8f8ffc6753 100644 --- a/apps/vms_decc_init.c +++ b/apps/vms_decc_init.c @@ -105,7 +105,8 @@ decc_feat_t decc_feat_array[] = { {(char *)NULL, 0} }; -char **copy_argv(int *argc, char *argv[]) + +char **copy_argv(int *argc, argv_t argv) { /*- * The note below is for historical purpose. On VMS now we always -- GitLab