From 0c1428f4418cbd4d449bd43100017b85db17b17d Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Mon, 17 May 2021 17:20:58 +0200 Subject: [PATCH] Fix configdata.pm.in's "use lib" for VMS `use lib` needs Unix formatted paths. For VMS, it means that we must make sure to convert paths, and we may as well generalise it. In this case, we need to adapt the functions sourcedir() and sourcefile() Reviewed-by: Tim Hudson (Merged from https://github.com/openssl/openssl/pull/15317) --- configdata.pm.in | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/configdata.pm.in b/configdata.pm.in index 6c0d30baa0..57ad440fa4 100644 --- a/configdata.pm.in +++ b/configdata.pm.in @@ -4,15 +4,39 @@ # We must make sourcedir() return an absolute path, because configdata.pm # may be loaded as a module from any script in any directory, making # relative paths untrustable. Because the result is used with 'use lib', - # we must ensure that it returns a Unix style path. Cwd::abs_path does - # that (File::Spec::Functions::rel2abs return O/S specific paths) - use File::Spec::Functions; + # we must ensure that it returns a Unix style path. Mixing File::Spec + # and File::Spec::Unix does just that. + use File::Spec::Unix; + use File::Spec; use Cwd qw(abs_path); + sub _fixup_path { + my $path = shift; + + # Make the path absolute at all times + $path = abs_path($path); + + if ($^O eq 'VMS') { + # Convert any path of the VMS form VOLUME:[DIR1.DIR2]FILE to the + # Unix form /VOLUME/DIR1/DIR2/FILE, which is what VMS perl supports + # for 'use lib'. + + # Start with spliting the native path + (my $vol, my $dirs, my $file) = File::Spec->splitpath($path); + my @dirs = File::Spec->splitdir($dirs); + + # Reassemble it as a Unix path + $vol =~ s|:$||; + $dirs = File::Spec::Unix->catdir('', $vol, @dirs); + $path = File::Spec::Unix->catpath('', $dirs, $file); + } + + return $path; + } sub sourcedir { - return abs_path(catdir($config{sourcedir}, @_)); + return _fixup_path(File::Spec->catdir($config{sourcedir}, @_)) } sub sourcefile { - return abs_path(catfile($config{sourcedir}, @_)); + return _fixup_path(File::Spec->catfile($config{sourcedir}, @_)) } use lib sourcedir('util', 'perl'); use OpenSSL::Util;