diff options
author | Rich Salz <rsalz@akamai.com> | 2014-07-16 11:58:33 -0400 |
---|---|---|
committer | Rich Salz <rsalz@akamai.com> | 2014-07-16 11:58:33 -0400 |
commit | a7027950387aeb6f070251bbab7b3ad2bdbedb8b (patch) | |
tree | e3df402e1bd3610a675530f2b06b037589d1dc90 | |
parent | b7dc7898f0dac60ced6201b17c027265606276af (diff) | |
download | openssl-new-a7027950387aeb6f070251bbab7b3ad2bdbedb8b.tar.gz |
Consistent use of argc/argv in main. This includes copying argv for VMS,
and rewriting chopup_args to do everything via its ARGS structure.
-rw-r--r-- | apps/apps.c | 114 | ||||
-rw-r--r-- | apps/apps.h | 7 | ||||
-rw-r--r-- | apps/openssl.c | 49 | ||||
-rwxr-xr-x | apps/vms_decc_init.c | 32 |
4 files changed, 109 insertions, 93 deletions
diff --git a/apps/apps.c b/apps/apps.c index 5b65f4c6f3..f92b73bb51 100644 --- a/apps/apps.c +++ b/apps/apps.c @@ -174,108 +174,90 @@ int str2fmt(char *s) { if (s == NULL) return FORMAT_UNDEF; - if ((*s == 'D') || (*s == 'd')) + switch (*s++) { + case 'D': case 'd': return(FORMAT_ASN1); - else if ((*s == 'T') || (*s == 't')) + case 'T': case 't': return(FORMAT_TEXT); - else if ((strcmp(s,"NSS") == 0) || (strcmp(s,"nss") == 0)) - return(FORMAT_NSS); - else if ((*s == 'N') || (*s == 'n')) + case 'N': case 'n': + if (strcmp(s,"SS") == 0 || strcmp(s,"ss") == 0) + return(FORMAT_NSS); return(FORMAT_NETSCAPE); - else if ((*s == 'S') || (*s == 's')) + case 'S': case 's': return(FORMAT_SMIME); - else if ((*s == 'M') || (*s == 'm')) + case 'M': case 'm': return(FORMAT_MSBLOB); - else if ((*s == '1') - || (strcmp(s,"PKCS12") == 0) || (strcmp(s,"pkcs12") == 0) - || (strcmp(s,"P12") == 0) || (strcmp(s,"p12") == 0)) + case '1': return(FORMAT_PKCS12); - else if ((*s == 'E') || (*s == 'e')) + case 'E': case 'e': return(FORMAT_ENGINE); - else if ((*s == 'H') || (*s == 'h')) + case 'H': case 'h': return FORMAT_HTTP; - else if ((*s == 'P') || (*s == 'p')) - { - if (s[1] == 'V' || s[1] == 'v') + case 'P': case 'p': + if (strcmp(s, "12") == 0 + || strcmp(s, "KCS12") == 0 + || strcmp(s, "kcs12") == 0) + return(FORMAT_PKCS12); + if (strcmp(s, "VK") == 0 || strcmp(s, "vk") == 0) return FORMAT_PVK; - else - return(FORMAT_PEM); - } - else - return(FORMAT_UNDEF); + return(FORMAT_PEM); + } + return(FORMAT_UNDEF); } -int chopup_args(ARGS *arg, char *buf, int *argc, char **argv[]) +int chopup_args(ARGS *arg, char *buf) { - int num,i; - char *p; + int quoted; + char c, *p; - *argc=0; - *argv=NULL; - - i=0; - if (arg->count == 0) + arg->argc = 0; + if (arg->size == 0) { - arg->count=20; - arg->data=(char **)OPENSSL_malloc(sizeof(char *)*arg->count); - if (arg->data == NULL) + arg->size=20; + arg->argv=(char **)OPENSSL_malloc(sizeof(char *)*arg->size); + if (arg->argv == NULL) return 0; } - for (i=0; i<arg->count; i++) - arg->data[i]=NULL; - num=0; - p=buf; - for (;;) + for (p=buf;;) { - /* first scan over white space */ - if (!*p) break; - while (*p && ((*p == ' ') || (*p == '\t') || (*p == '\n'))) + /* Skip whitespace. */ + while (*p && isspace(*p)) p++; if (!*p) break; /* The start of something good :-) */ - if (num >= arg->count) + if (arg->argc >= arg->size) { - char **tmp_p; - int tlen = arg->count + 20; - tmp_p = (char **)OPENSSL_realloc(arg->data, - sizeof(char *)*tlen); - if (tmp_p == NULL) + arg->size += 20; + arg->argv = (char **)OPENSSL_realloc(arg->argv, + sizeof(char *)*arg->size); + if (arg->argv == NULL) return 0; - arg->data = tmp_p; - arg->count = tlen; - /* initialize newly allocated data */ - for (i = num; i < arg->count; i++) - arg->data[i] = NULL; } - arg->data[num++]=p; + quoted = *p == '\'' || *p == '"'; + if (quoted) + c = *p++; + arg->argv[arg->argc++]=p; + /* now look for the end of this */ - if ((*p == '\'') || (*p == '\"')) /* scan for closing quote */ + if (quoted) { - i= *(p++); - arg->data[num-1]++; /* jump over quote */ - while (*p && (*p != i)) + while (*p && *p != c) p++; - *p='\0'; + *p++='\0'; } else { - while (*p && ((*p != ' ') && - (*p != '\t') && (*p != '\n'))) + while (*p && !isspace(*p)) p++; - - if (*p == '\0') - p--; - else - *p='\0'; + if (*p) + *p++='\0'; } - p++; } - *argc=num; - *argv=arg->data; + arg->argv[arg->argc] = NULL; return(1); } diff --git a/apps/apps.h b/apps/apps.h index 12a1ec194c..0b8639de61 100644 --- a/apps/apps.h +++ b/apps/apps.h @@ -328,8 +328,9 @@ extern void opt_help(const OPTIONS* list); typedef struct args_st { - char **data; - int count; + int size; + int argc; + char **argv; } ARGS; #define PW_MIN_LENGTH 4 @@ -345,7 +346,7 @@ int password_callback(char *buf, int bufsiz, int verify, int setup_ui_method(void); void destroy_ui_method(void); -int chopup_args(ARGS *arg,char *buf, int *argc, char **argv[]); +int chopup_args(ARGS *arg,char *buf); #ifdef HEADER_X509_H int dump_cert_text(BIO *out, X509 *x); void print_name(BIO *out, const char *title, X509_NAME *nm, unsigned long lflags); diff --git a/apps/openssl.c b/apps/openssl.c index 43f2e59ae0..db615ed3f9 100644 --- a/apps/openssl.c +++ b/apps/openssl.c @@ -337,30 +337,30 @@ BIO* bio_open_default(const char* filename, const char* mode) return NULL; } - -#if defined( OPENSSL_SYS_VMS) && (__INITIAL_POINTER_SIZE == 64) -# define ARGV _Argv -#else -# define ARGV Argv +#if defined( OPENSSL_SYS_VMS) +extern char** copy_argv(int *argc, char **argv); #endif -int main(int Argc, char *ARGV[]) +int main(int argc, char *argv[]) { ARGS arg; -#define PROG_NAME_SIZE 39 char *pname; FUNCTION f,*fp; MS_STATIC const char *prompt; MS_STATIC char buf[1024]; char *to_free=NULL; int n,i,ret=0; - int argc; - char **argv,*p; + char *p; LHASH_OF(FUNCTION) *prog=NULL; long errline; + char **copied_argv=NULL; - arg.data=NULL; - arg.count=0; + arg.argv=NULL; + arg.size=0; + +#if defined( OPENSSL_SYS_VMS) + copied_argv = argv = copy_argv(&argc, argv); +#endif if (getenv("OPENSSL_DEBUG_MEMORY") != NULL) /* if not defined, use compiled-in library defaults */ { @@ -437,25 +437,25 @@ int main(int Argc, char *ARGV[]) } prog=prog_init(); - pname = opt_progname(Argv[0]); + pname = opt_progname(argv[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[0]=pname; + ret=fp->func(argc,argv); goto end; } /* ok, now check that there are not arguments, if there are, * run with them, shifting the ssleay off the front */ - if (Argc != 1) + if (argc != 1) { - Argc--; - Argv++; - ret=do_cmd(prog,Argc,Argv); + argc--; + argv++; + ret=do_cmd(prog,argc,argv); if (ret < 0) ret=0; goto end; } @@ -486,9 +486,9 @@ int main(int Argc, char *ARGV[]) p+=i; n-=i; } - if (!chopup_args(&arg,buf,&argc,&argv)) break; + if (!chopup_args(&arg,buf)) break; - ret=do_cmd(prog,argc,argv); + ret=do_cmd(prog,arg.argc,arg.argv); if (ret < 0) { ret=0; @@ -502,6 +502,8 @@ int main(int Argc, char *ARGV[]) BIO_printf(bio_err,"bad exit\n"); ret=1; end: + if (copied_argv) + OPENSSL_free(copied_argv); if (to_free) OPENSSL_free(to_free); if (config != NULL) @@ -510,7 +512,7 @@ end: config=NULL; } if (prog != NULL) lh_FUNCTION_free(prog); - if (arg.data != NULL) OPENSSL_free(arg.data); + if (arg.argv != NULL) OPENSSL_free(arg.argv); apps_shutdown(); @@ -537,6 +539,8 @@ static int do_cmd(LHASH_OF(FUNCTION) *prog, int argc, char *argv[]) if ((argc <= 0) || (argv[0] == NULL)) { ret=0; goto end; } + if (strcmp(argv[0], ":") == 0) + argc--, argv++; f.name=argv[0]; fp=lh_FUNCTION_retrieve(prog,&f); if (fp == NULL) @@ -596,9 +600,6 @@ static int do_cmd(LHASH_OF(FUNCTION) *prog, int argc, char *argv[]) else if (strcmp(argv[0],LIST_CIPHER_ALGORITHMS) == 0) list_type = FUNC_TYPE_CIPHER_ALG; - if (!load_config(bio_err, NULL)) - goto end; - if (list_type == FUNC_TYPE_PKEY) list_pkey(bio_out); if (list_type == FUNC_TYPE_MD_ALG) diff --git a/apps/vms_decc_init.c b/apps/vms_decc_init.c index f512c8f1bc..1aebb5ce67 100755 --- a/apps/vms_decc_init.c +++ b/apps/vms_decc_init.c @@ -60,6 +60,38 @@ decc_feat_t decc_feat_array[] = { (char *)NULL, 0 } }; + +char **copy_argv(int *argc, char *argv[]) +{ + /* 2011-03-22 SMS. + * 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. + * + * 2014-07-16, rsalz: Simpler -- just always copy it. + */ + + int i; + char **newargv = (char **)OPENSSL_malloc((*argc+1) * sizeof *newargv); + + for (i = 0; argv[i]; i++) + newargv[i] = argv[i]; + newargv[i] = NULL; + *argc = i; + return newargv; +} /* LIB$INITIALIZE initialization function. */ |