Greetings,
I have identified several problems in the way OpenSSL 1.0.0's c_rehash works.
This breaks on any nonstandard configuration, in that:
- c_rehash POSTFIXES $dir/bin to the PATH, when it should prefix it. ($dir
inherits $openssldir from Configure)
- c_rehash should use $prefix/bin, not $openssldir/bin (comment ditto)
This causes several issues:
- If THE RIGHT VERSION OF openssl isn't already in PATH
or unless openssl is (uncommon!) overridden to $prefix/bin, c_rehash will be
unable to identify the proper openssl executable and abort.
- If multiple versions of OpenSSL are installed in parallel, for instance,
0.9.8X under /usr and OpenSSL 1.0.0 under /opt/openssl-1.0.0, c_rehash will
grab the wrong version of openssl and thus the wrong hash algorithm, making
OpenSSL unable to find its certificates.
This has already caused bogus bug reports:
<https://developer.berlios.de/bugs/?func=detailbug&bug_id=17073&group_id=1824>
The attached patch fixes these OpenSSL issues:
- It adds a line "my $prefix;" to tools/c_rehash.in
- It uses the line to derive the path component
- It PREPENDS this to the existing path
- It AVOIDS adding a path separator if $ENV{PATH} happens to be empty
- It teaches Configure to replace my $prefix as it regenerates c_rehash from
the .in file.
The patch applies to OpenSSL 1.0.0 on - I guess - all platforms, and possibly
earlier versions too. Please check earlier versions and adopt where needed.
Thank you.
--
Matthias Andree
diff -up ./Configure.orig ./Configure
--- ./Configure.orig 2010-01-19 22:40:54.000000000 +0100
+++ ./Configure 2010-04-12 18:24:47.000000000 +0200
@@ -1789,11 +1789,11 @@ EOF
(system $make_command.$make_targets) == 0 or exit $?
if $make_targets ne "";
if ( $perl =~ m...@^/@) {
- &dofile("tools/c_rehash",$perl,'^#!/', '#!%s','^my \$dir;$', 'my
$dir = "' . $openssldir . '";');
+ &dofile("tools/c_rehash",$perl,'^#!/', '#!%s','^my \$dir;$', 'my
$dir = "' . $openssldir . '";', '^my \$prefix;$', 'my $prefix = "' . $prefix .
'";');
&dofile("apps/CA.pl",$perl,'^#!/', '#!%s');
} else {
# No path for Perl known ...
- &dofile("tools/c_rehash",'/usr/local/bin/perl','^#!/', '#!%s','^my
\$dir;$', 'my $dir = "' . $openssldir . '";');
+ &dofile("tools/c_rehash",'/usr/local/bin/perl','^#!/', '#!%s','^my
\$dir;$', 'my $dir = "' . $openssldir . '";', '^my \$prefix;$', 'my $prefix =
"' . $prefix . '";');
&dofile("apps/CA.pl",'/usr/local/bin/perl','^#!/', '#!%s');
}
if ($depflags ne $default_depflags && !$make_depend) {
diff -up ./tools/c_rehash.in.orig ./tools/c_rehash.in
--- ./tools/c_rehash.in.orig 2009-04-22 18:50:42.000000000 +0200
+++ ./tools/c_rehash.in 2010-04-12 18:23:39.000000000 +0200
@@ -7,6 +7,7 @@
my $openssl;
my $dir;
+my $prefix;
if(defined $ENV{OPENSSL}) {
$openssl = $ENV{OPENSSL};
@@ -24,7 +25,7 @@ if (defined(&Cwd::getcwd)) {
}
my $path_delim = ($pwd =~ /^[a-z]\:/i) ? ';' : ':'; # DOS/Win32 or Unix
delimiter?
-$ENV{PATH} .= "$path_delim$dir/bin";
+$ENV{PATH} = "$prefix/bin" . ($ENV{PATH} ? $path_delim . $ENV{PATH} : ""); #
prefix our path
if(! -x $openssl) {
my $found = 0;