Fix pointer size issues with argv on VMS
authorRichard Levitte <levitte@openssl.org>
Wed, 30 Mar 2016 06:35:18 +0000 (08:35 +0200)
committerRichard Levitte <levitte@openssl.org>
Wed, 30 Mar 2016 18:25:08 +0000 (20:25 +0200)
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 <appro@openssl.org>
apps/apps.h
apps/openssl.c
apps/vms_decc_init.c

index fc480e1..7cf0dc4 100644 (file)
@@ -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;
index 2d9ddaa..166c7a1 100644 (file)
@@ -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;
index b66c00f..8f8ffc6 100644 (file)
@@ -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