Commit 087ca80a authored by Richard Levitte's avatar Richard Levitte
Browse files

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: default avatarAndy Polyakov <appro@openssl.org>
parent 90dbd250
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -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;
+10 −11
Original line number Diff line number Diff line
@@ -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;
+2 −1
Original line number Diff line number Diff line
@@ -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