X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=apps%2Fopt.c;h=902563639679fd6298dae6fbd04ae215c29e11d8;hp=40d6a279b3dfa36b0b7f50c9f956f8671adc054d;hb=f39276fdff6ccc1c71bdb30a8050fa1c0bf6e20a;hpb=00dfbaad88a69ed8294d6039bf5f7d722f72bf39 diff --git a/apps/opt.c b/apps/opt.c index 40d6a279b3..9025636396 100644 --- a/apps/opt.c +++ b/apps/opt.c @@ -1,5 +1,5 @@ /* - * Copyright 2015-2017 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the OpenSSL license (the "License"). You may not use * this file except in compliance with the License. You can obtain a copy @@ -58,8 +58,8 @@ char *opt_progname(const char *argv0) n -= 4; /* Copy over the name, in lowercase. */ - if (n > sizeof prog - 1) - n = sizeof prog - 1; + if (n > sizeof(prog) - 1) + n = sizeof(prog) - 1; for (q = prog, i = 0; i < n; i++, p++) *q++ = tolower((unsigned char)*p); *q = '\0'; @@ -80,9 +80,9 @@ char *opt_progname(const char *argv0) } q = strrchr(p, '.'); - strncpy(prog, p, sizeof prog - 1); - prog[sizeof prog - 1] = '\0'; - if (q != NULL && q - p < sizeof prog) + strncpy(prog, p, sizeof(prog) - 1); + prog[sizeof(prog) - 1] = '\0'; + if (q != NULL && q - p < sizeof(prog)) prog[q - p] = '\0'; return prog; } @@ -99,8 +99,8 @@ char *opt_progname(const char *argv0) p++; break; } - strncpy(prog, p, sizeof prog - 1); - prog[sizeof prog - 1] = '\0'; + strncpy(prog, p, sizeof(prog) - 1); + prog[sizeof(prog) - 1] = '\0'; return prog; } #endif @@ -278,7 +278,7 @@ int opt_cipher(const char *name, const EVP_CIPHER **cipherp) *cipherp = EVP_get_cipherbyname(name); if (*cipherp != NULL) return 1; - BIO_printf(bio_err, "%s: Unknown cipher %s\n", prog, name); + BIO_printf(bio_err, "%s: Unrecognized flag %s\n", prog, name); return 0; } @@ -290,7 +290,7 @@ int opt_md(const char *name, const EVP_MD **mdp) *mdp = EVP_get_digestbyname(name); if (*mdp != NULL) return 1; - BIO_printf(bio_err, "%s: Unknown digest %s\n", prog, name); + BIO_printf(bio_err, "%s: Unrecognized flag %s\n", prog, name); return 0; } @@ -613,13 +613,17 @@ int opt_verify(int opt, X509_VERIFY_PARAM *vpm) */ int opt_next(void) { - char *p; + char *p, *estr; const OPTIONS *o; int ival; long lval; unsigned long ulval; ossl_intmax_t imval; ossl_uintmax_t umval; +#if !defined(_WIN32) + char *c; + int oerrno; +#endif /* Look at current arg; at end of the list? */ arg = NULL; @@ -676,13 +680,13 @@ int opt_next(void) /* Just a string. */ break; case '/': - if (app_isdir(arg) >= 0) + if (app_isdir(arg) > 0) break; BIO_printf(bio_err, "%s: Not a directory: %s\n", prog, arg); return -1; case '<': /* Input file. */ - if (strcmp(arg, "-") == 0 || app_access(arg, R_OK) >= 0) + if (strcmp(arg, "-") == 0 || app_access(arg, R_OK) == 0) break; BIO_printf(bio_err, "%s: Cannot open input file %s, %s\n", @@ -690,11 +694,38 @@ int opt_next(void) return -1; case '>': /* Output file. */ - if (strcmp(arg, "-") == 0 || app_access(arg, W_OK) >= 0 || errno == ENOENT) +#if !defined(_WIN32) + c = OPENSSL_strdup(arg); + if (c == NULL) { + BIO_printf(bio_err, + "%s: Memory allocation failure\n", prog); + return -1; + } + oerrno = errno; + errno = 0; + if (strcmp(arg, "-") == 0 + || (app_access(app_dirname(c), W_OK) == 0 + && app_isdir(arg) <= 0 + && (app_access(arg, W_OK) == 0 || errno == ENOENT))) { + OPENSSL_free(c); break; + } + OPENSSL_free(c); + if (errno == 0) + /* only possible if 'arg' is a directory */ + estr = "is a directory"; + else + estr = strerror(errno); + errno = oerrno; +#else + if (strcmp(arg, "-") == 0 || app_access(arg, W_OK) == 0 + || errno == ENOENT) + break; + estr = strerror(errno); +#endif BIO_printf(bio_err, "%s: Cannot open output file %s, %s\n", - prog, arg, strerror(errno)); + prog, arg, estr); return -1; case 'p': case 'n': @@ -859,7 +890,7 @@ void opt_help(const OPTIONS *list) i += 1 + strlen(valtype2param(o)); if (i < MAX_OPT_HELP_WIDTH && i > width) width = i; - assert(i < (int)sizeof start); + assert(i < (int)sizeof(start)); } if (standard_prolog) @@ -876,7 +907,7 @@ void opt_help(const OPTIONS *list) /* Pad out prefix */ memset(start, ' ', sizeof(start) - 1); - start[sizeof start - 1] = '\0'; + start[sizeof(start) - 1] = '\0'; if (o->name == OPT_MORE_STR) { /* Continuation of previous line; pad and print. */