X-Git-Url: https://git.openssl.org/?p=openssl.git;a=blobdiff_plain;f=apps%2Frehash.c;h=ad7108aad9511ab1c08d439ade5f8323d8c4f7d1;hp=4e10ded7903e50534ae7b7174b8a0faeaba6d47c;hb=624265c60e07f8e5f251d0f5b79e34cf0221af73;hpb=7d959c358a09244bcaea601121b276529ff437ce diff --git a/apps/rehash.c b/apps/rehash.c index 4e10ded790..ad7108aad9 100644 --- a/apps/rehash.c +++ b/apps/rehash.c @@ -1,5 +1,6 @@ /* - * Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 2015-2017 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2013-2014 Timo Teräs * * Licensed under the OpenSSL license (the "License"). You may not use * this file except in compliance with the License. You can obtain a copy @@ -7,16 +8,10 @@ * https://www.openssl.org/source/license.html */ -/* - * C implementation based on the original Perl and shell versions - * - * Copyright (c) 2013-2014 Timo Teräs - */ - #include "apps.h" #if defined(OPENSSL_SYS_UNIX) || defined(__APPLE__) || \ - (defined(__VMS) && defined(__DECC) && __CTRL_VER >= 80300000) + (defined(__VMS) && defined(__DECC) && __CRTL_VER >= 80300000) # include # include # include @@ -25,7 +20,23 @@ # include # include +/* + * Make sure that the processing of symbol names is treated the same as when + * libcrypto is built. This is done automatically for public headers (see + * include/openssl/__DECC_INCLUDE_PROLOGUE.H and __DECC_INCLUDE_EPILOGUE.H), + * but not for internal headers. + */ +# ifdef __VMS +# pragma names save +# pragma names as_is,shortened +# endif + # include "internal/o_dir.h" + +# ifdef __VMS +# pragma names restore +# endif + # include # include # include @@ -238,11 +249,11 @@ static int do_file(const char *filename, const char *fullpath, enum Hash h) goto end; } x = sk_X509_INFO_value(inf, 0); - if (x->x509) { + if (x->x509 != NULL) { type = TYPE_CERT; name = X509_get_subject_name(x->x509); X509_digest(x->x509, evpmd, digest, NULL); - } else if (x->crl) { + } else if (x->crl != NULL) { type = TYPE_CRL; name = X509_CRL_get_issuer(x->crl); X509_CRL_digest(x->crl, evpmd, digest, NULL); @@ -250,7 +261,7 @@ static int do_file(const char *filename, const char *fullpath, enum Hash h) ++errs; goto end; } - if (name) { + if (name != NULL) { if ((h == HASH_NEW) || (h == HASH_BOTH)) errs += add_entry(type, X509_NAME_hash(name), filename, digest, 1, ~0); if ((h == HASH_OLD) || (h == HASH_BOTH)) @@ -267,6 +278,38 @@ static void str_free(char *s) OPENSSL_free(s); } +static int ends_with_dirsep(const char *path) +{ + if (*path != '\0') + path += strlen(path) - 1; +# if defined __VMS + if (*path == ']' || *path == '>' || *path == ':') + return 1; +# elif defined _WIN32 + if (*path == '\\') + return 1; +# endif + return *path == '/'; +} + +static int massage_filename(char *name) +{ +# ifdef __VMS + char *p = strchr(name, ';'); + char *q = p; + + if (q != NULL) { + for (q++; *q != '\0'; q++) { + if (!isdigit(*q)) + return 1; + } + } + + *p = '\0'; +# endif + return 1; +} + /* * Process a directory; return number of errors found. */ @@ -289,7 +332,7 @@ static int do_dir(const char *dirname, enum Hash h) return 1; } buflen = strlen(dirname); - pathsep = (buflen && dirname[buflen - 1] == '/') ? "" : "/"; + pathsep = (buflen && !ends_with_dirsep(dirname)) ? "/": ""; buflen += NAME_MAX + 1 + 1; buf = app_malloc(buflen, "filename buffer"); @@ -302,6 +345,7 @@ static int do_dir(const char *dirname, enum Hash h) } while ((filename = OPENSSL_DIR_read(&d, dirname)) != NULL) { if ((copy = strdup(filename)) == NULL + || !massage_filename(copy) || sk_OPENSSL_STRING_push(files, copy) == 0) { BIO_puts(bio_err, "out of memory\n"); exit(1); @@ -313,8 +357,8 @@ static int do_dir(const char *dirname, enum Hash h) numfiles = sk_OPENSSL_STRING_num(files); for (n = 0; n < numfiles; ++n) { filename = sk_OPENSSL_STRING_value(files, n); - if (snprintf(buf, buflen, "%s%s%s", - dirname, pathsep, filename) >= buflen) + if (BIO_snprintf(buf, buflen, "%s%s%s", + dirname, pathsep, filename) >= buflen) continue; if (lstat(buf, &st) < 0) continue; @@ -337,8 +381,8 @@ static int do_dir(const char *dirname, enum Hash h) nextep = ep->next; if (ep->old_id < bp->num_needed) { /* Link exists, and is used as-is */ - snprintf(buf, buflen, "%08x.%s%d", bp->hash, - suffixes[bp->type], ep->old_id); + BIO_snprintf(buf, buflen, "%08x.%s%d", bp->hash, + suffixes[bp->type], ep->old_id); if (verbose) BIO_printf(bio_out, "link %s -> %s\n", ep->filename, buf); @@ -347,9 +391,9 @@ static int do_dir(const char *dirname, enum Hash h) while (bit_isset(idmask, nextid)) nextid++; - snprintf(buf, buflen, "%s%s%n%08x.%s%d", - dirname, pathsep, &n, bp->hash, - suffixes[bp->type], nextid); + BIO_snprintf(buf, buflen, "%s%s%n%08x.%s%d", + dirname, pathsep, &n, bp->hash, + suffixes[bp->type], nextid); if (verbose) BIO_printf(bio_out, "link %s -> %s\n", ep->filename, &buf[n]); @@ -369,9 +413,9 @@ static int do_dir(const char *dirname, enum Hash h) bit_set(idmask, nextid); } else if (remove_links) { /* Link to be deleted */ - snprintf(buf, buflen, "%s%s%n%08x.%s%d", - dirname, pathsep, &n, bp->hash, - suffixes[bp->type], ep->old_id); + BIO_snprintf(buf, buflen, "%s%s%n%08x.%s%d", + dirname, pathsep, &n, bp->hash, + suffixes[bp->type], ep->old_id); if (verbose) BIO_printf(bio_out, "unlink %s\n", &buf[n]); @@ -399,7 +443,7 @@ typedef enum OPTION_choice { OPT_COMPAT, OPT_OLD, OPT_N, OPT_VERBOSE } OPTION_CHOICE; -OPTIONS rehash_options[] = { +const OPTIONS rehash_options[] = { {OPT_HELP_STR, 1, '-', "Usage: %s [options] [cert-directory...]\n"}, {OPT_HELP_STR, 1, '-', "Valid options are:\n"}, {"help", OPT_HELP, '-', "Display this summary"}, @@ -450,8 +494,8 @@ int rehash_main(int argc, char **argv) evpmd = EVP_sha1(); evpmdsize = EVP_MD_size(evpmd); - if (*argv) { - while (*argv) + if (*argv != NULL) { + while (*argv != NULL) errs += do_dir(*argv++, h); } else if ((env = getenv("SSL_CERT_DIR")) != NULL) { m = OPENSSL_strdup(env); @@ -467,7 +511,7 @@ int rehash_main(int argc, char **argv) } #else -OPTIONS rehash_options[] = { +const OPTIONS rehash_options[] = { {NULL} };