The branch master has been updated
       via  a5829ae282f47c39d1dd0642e4a84c0a6f3d80f4 (commit)
       via  86a227ee1b7cae68dfbe5737bf3193a8f03eb138 (commit)
       via  4f7c840a4dba37d8465137eae6867968e251c13c (commit)
      from  c130c0fe1d386fcc05d5b7accf062fe72b7272e8 (commit)


- Log -----------------------------------------------------------------
commit a5829ae282f47c39d1dd0642e4a84c0a6f3d80f4
Author: Richard Levitte <levi...@openssl.org>
Date:   Sun Mar 11 23:48:04 2018 +0100

    Adjust LPdir_unix.c on VMS for OpenSSL expectations
    
    When OPENSSL_DIR_read implemented by LPdir_unix.c gets a Unixy path,
    it will return file names like you'd expect them on Unix.
    
    However, if given a path with VMS syntax, such as "[.foo]", it returns
    file names with generation numbers, such as "bar.txt;1", which makes
    sense for VMS expectations, but can be surprising for OpenSSL.
    
    Our solution is to simply shave off the generation number if
    OPENSSL_DIR_read() expects there should be one, and make sure not to
    return the same file name twice.  Note that VMS filesystems are case
    insensitive, so the check for duplicate file names are done without
    regard to character case.
    
    Reviewed-by: Tim Hudson <t...@openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/5587)

commit 86a227ee1b7cae68dfbe5737bf3193a8f03eb138
Author: Richard Levitte <levi...@openssl.org>
Date:   Sun Mar 11 23:47:40 2018 +0100

    CONF inclusion test: Add VMS specific tests
    
    We want to see that VMS syntax paths are treated correctly.
    
    Reviewed-by: Tim Hudson <t...@openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/5587)

commit 4f7c840a4dba37d8465137eae6867968e251c13c
Author: Richard Levitte <levi...@openssl.org>
Date:   Sun Mar 11 10:14:11 2018 +0100

    CONF: On VMS, treat VMS syntax inclusion paths correctly
    
    non-VMS syntax inclusion paths get the same treatment as on Unix.
    
    Reviewed-by: Tim Hudson <t...@openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/5587)

-----------------------------------------------------------------------

Summary of changes:
 crypto/LPdir_unix.c                                | 39 ++++++++++++++++++++--
 crypto/conf/conf_def.c                             | 22 ++++++++++--
 test/recipes/90-test_includes.t                    | 10 +++++-
 .../{includes.cnf => vms-includes-file.cnf}        |  2 +-
 .../{includes.cnf => vms-includes.cnf}             |  2 +-
 5 files changed, 67 insertions(+), 8 deletions(-)
 copy test/recipes/90-test_includes_data/{includes.cnf => 
vms-includes-file.cnf} (65%)
 copy test/recipes/90-test_includes_data/{includes.cnf => vms-includes.cnf} 
(65%)

diff --git a/crypto/LPdir_unix.c b/crypto/LPdir_unix.c
index 6648a60..356089d 100644
--- a/crypto/LPdir_unix.c
+++ b/crypto/LPdir_unix.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2004-2016 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 2004-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
@@ -11,7 +11,7 @@
  * This file is dual-licensed and is also available under the following
  * terms:
  *
- * Copyright (c) 2004, Richard Levitte <rich...@levitte.org>
+ * Copyright (c) 2004, 2018, Richard Levitte <rich...@levitte.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -46,6 +46,9 @@
 #ifndef LPDIR_H
 # include "LPdir.h"
 #endif
+#ifdef __VMS
+# include <ctype.h>
+#endif
 
 /*
  * The POSIXly macro for the maximum number of characters in a file path is
@@ -73,6 +76,10 @@
 struct LP_dir_context_st {
     DIR *dir;
     char entry_name[LP_ENTRY_SIZE + 1];
+#ifdef __VMS
+    int expect_file_generations;
+    char previous_entry_name[LP_ENTRY_SIZE + 1];
+#endif
 };
 
 const char *LP_find_file(LP_DIR_CTX **ctx, const char *directory)
@@ -93,6 +100,15 @@ const char *LP_find_file(LP_DIR_CTX **ctx, const char 
*directory)
         }
         memset(*ctx, 0, sizeof(**ctx));
 
+#ifdef __VMS
+        {
+            char c = directory[strlen(directory) - 1];
+
+            if (c == ']' || c == '>' || c == ':')
+                (*ctx)->expect_file_generations = 1;
+        }
+#endif
+
         (*ctx)->dir = opendir(directory);
         if ((*ctx)->dir == NULL) {
             int save_errno = errno; /* Probably not needed, but I'm paranoid */
@@ -103,6 +119,13 @@ const char *LP_find_file(LP_DIR_CTX **ctx, const char 
*directory)
         }
     }
 
+#ifdef __VMS
+    strncpy((*ctx)->previous_entry_name, (*ctx)->entry_name,
+            sizeof((*ctx)->previous_entry_name));
+
+ again:
+#endif
+
     direntry = readdir((*ctx)->dir);
     if (direntry == NULL) {
         return 0;
@@ -111,6 +134,18 @@ const char *LP_find_file(LP_DIR_CTX **ctx, const char 
*directory)
     strncpy((*ctx)->entry_name, direntry->d_name,
             sizeof((*ctx)->entry_name) - 1);
     (*ctx)->entry_name[sizeof((*ctx)->entry_name) - 1] = '\0';
+#ifdef __VMS
+    if ((*ctx)->expect_file_generations) {
+        char *p = (*ctx)->entry_name + strlen((*ctx)->entry_name);
+
+        while(p > (*ctx)->entry_name && isdigit(p[-1]))
+            p--;
+        if (p > (*ctx)->entry_name && p[-1] == ';')
+            p[-1] = '\0';
+        if (strcasecmp((*ctx)->entry_name, (*ctx)->previous_entry_name) == 0)
+            goto again;
+    }
+#endif
     return (*ctx)->entry_name;
 }
 
diff --git a/crypto/conf/conf_def.c b/crypto/conf/conf_def.c
index d689502..752859d 100644
--- a/crypto/conf/conf_def.c
+++ b/crypto/conf/conf_def.c
@@ -685,6 +685,7 @@ static BIO *get_next_file(const char *path, OPENSSL_DIR_CTX 
**dirctx)
 
         namelen = strlen(filename);
 
+
         if ((namelen > 5 && strcasecmp(filename + namelen - 5, ".conf") == 0)
             || (namelen > 4 && strcasecmp(filename + namelen - 4, ".cnf") == 
0)) {
             size_t newlen;
@@ -697,10 +698,25 @@ static BIO *get_next_file(const char *path, 
OPENSSL_DIR_CTX **dirctx)
                 CONFerr(CONF_F_GET_NEXT_FILE, ERR_R_MALLOC_FAILURE);
                 break;
             }
-            OPENSSL_strlcat(newpath, path, newlen);
-#ifndef OPENSSL_SYS_VMS
-            OPENSSL_strlcat(newpath, "/", newlen);
+#ifdef OPENSSL_SYS_VMS
+            /*
+             * If the given path isn't clear VMS syntax,
+             * we treat it as on Unix.
+             */
+            {
+                size_t pathlen = strlen(path);
+
+                if (path[pathlen - 1] == ']' || path[pathlen - 1] == '>'
+                    || path[pathlen - 1] == ':') {
+                    /* Clear VMS directory syntax, just copy as is */
+                    OPENSSL_strlcpy(newpath, path, newlen);
+                }
+            }
 #endif
+            if (newpath[0] == '\0') {
+                OPENSSL_strlcpy(newpath, path, newlen);
+                OPENSSL_strlcat(newpath, "/", newlen);
+            }
             OPENSSL_strlcat(newpath, filename, newlen);
 
             bio = BIO_new_file(newpath, "r");
diff --git a/test/recipes/90-test_includes.t b/test/recipes/90-test_includes.t
index 9cf75a1..5169700 100644
--- a/test/recipes/90-test_includes.t
+++ b/test/recipes/90-test_includes.t
@@ -10,8 +10,16 @@ setup("test_includes");
 plan skip_all => "test_includes doesn't work without posix-io"
     if disabled("posix-io");
 
-plan tests => 3;                # The number of tests being performed
+plan tests =>                   # The number of tests being performed
+    3
+    + ($^O eq "VMS" ? 2 : 0);
 
 ok(run(test(["conf_include_test", data_file("includes.cnf")])), "test 
directory includes");
 ok(run(test(["conf_include_test", data_file("includes-file.cnf")])), "test 
file includes");
+if ($^O eq "VMS") {
+    ok(run(test(["conf_include_test", data_file("vms-includes.cnf")])),
+       "test directory includes, VMS syntax");
+    ok(run(test(["conf_include_test", data_file("vms-includes-file.cnf")])),
+       "test file includes, VMS syntax");
+}
 ok(run(test(["conf_include_test", data_file("includes-broken.cnf"), "f"])), 
"test broken includes");
diff --git a/test/recipes/90-test_includes_data/includes.cnf 
b/test/recipes/90-test_includes_data/vms-includes-file.cnf
similarity index 65%
copy from test/recipes/90-test_includes_data/includes.cnf
copy to test/recipes/90-test_includes_data/vms-includes-file.cnf
index 345eeb9..f3b72e7 100644
--- a/test/recipes/90-test_includes_data/includes.cnf
+++ b/test/recipes/90-test_includes_data/vms-includes-file.cnf
@@ -2,4 +2,4 @@
 # Example configuration file using includes.
 #
 
-.include conf-includes
+.include vms-includes.cnf
diff --git a/test/recipes/90-test_includes_data/includes.cnf 
b/test/recipes/90-test_includes_data/vms-includes.cnf
similarity index 65%
copy from test/recipes/90-test_includes_data/includes.cnf
copy to test/recipes/90-test_includes_data/vms-includes.cnf
index 345eeb9..ed4367b 100644
--- a/test/recipes/90-test_includes_data/includes.cnf
+++ b/test/recipes/90-test_includes_data/vms-includes.cnf
@@ -2,4 +2,4 @@
 # Example configuration file using includes.
 #
 
-.include conf-includes
+.include [.conf-includes]
_____
openssl-commits mailing list
To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-commits

Reply via email to