From: Richard Levitte Date: Thu, 22 Jan 2004 22:35:56 +0000 (+0000) Subject: [Merged from the main trunk] X-Git-Tag: OpenSSL_0_9_6m~10 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=1a4dc04dc4342c02a42afb03dd317f624cfd19dc;p=oweals%2Fopenssl.git [Merged from the main trunk] Adding a slash between the directoryt and the file is a problem with VMS. The C RTL can handle it well if the "directory" is a logical name with no colon, therefore ending being 'logname/file'. However, if the given logical names actually has a colon, or if you use a full VMS-syntax directory, you end up with 'logname:/file' or 'dev:[dir1.dir2]/file', and that isn't handled in any good way. So, on VMS, we need to check if the directory string ends with a separator (one of ':', ']' or '>' (< and > can be used instead [ and ])), and handle that by not inserting anything between the directory spec and the file name. In all other cases, it's assumed the directory spec is a logical name, so we need to place a colon between it and the file. Notified by Kevin Greaney . --- diff --git a/crypto/x509/by_dir.c b/crypto/x509/by_dir.c index 448bd7e69c..f09022379f 100644 --- a/crypto/x509/by_dir.c +++ b/crypto/x509/by_dir.c @@ -302,8 +302,36 @@ static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name, k=0; for (;;) { - sprintf(b->data,"%s/%08lx.%s%d",ctx->dirs[i],h, - postfix,k); + char c = '/'; +#ifdef VMS + c = ctx->dirs[i][strlen(ctx->dirs[i])-1]; + if (c != ':' && c != '>' && c != ']') + { + /* If no separator is present, we assume the + directory specifier is a logical name, and + add a colon. We really should use better + VMS routines for merging things like this, + but this will do for now... + -- Richard Levitte */ + c = ':'; + } + else + { + c = '\0'; + } +#endif + if (c == '\0') + { + /* This is special. When c == '\0', no + directory separator should be added. */ + sprintf(b->data,"%s%08lx.%s%d",ctx->dirs[i],h, + postfix,k); + } + else + { + snprintf(b->data,"%s%c%08lx.%s%d", + ctx->dirs[i],c,h,postfix,k); + } k++; if (stat(b->data,&st) < 0) break;