summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Salz <rsalz@akamai.com>2014-07-16 11:58:33 -0400
committerRich Salz <rsalz@akamai.com>2014-07-16 11:58:33 -0400
commita7027950387aeb6f070251bbab7b3ad2bdbedb8b (patch)
treee3df402e1bd3610a675530f2b06b037589d1dc90
parentb7dc7898f0dac60ced6201b17c027265606276af (diff)
downloadopenssl-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.c114
-rw-r--r--apps/apps.h7
-rw-r--r--apps/openssl.c49
-rwxr-xr-xapps/vms_decc_init.c32
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. */