So, it turns out that IO::Socket::SSL v2.005 -- in particular, the
PublicSuffix.pm -- wasn't thread-safe, which was causing it to fail in
the mod_perl environment. They released v2.006 over the weekend, which
addresses this issue (as well as others). I did verify today that the
new version works well.
Thanks for listening!
Michael
Michael A. Capone wrote:
Hello,
I'll try not to make this too convoluted... :)
The latest version of IO::Socket::SSL on CPAN is v2.005 and includes a
module IO::Socket::SSL::PublicSuffix. When attempting to use this
version of IO::Socket::SSL in modperl, we got a strange 500 Internal
Server error. Some debugging led to PublicSuffix.pm. Lines 291-301
of that file basically read in data from the __DATA__ section at the
end of the file, until they hit a particular marker. The way the code
is written to do it works fine on the command line, but fails in
mod_perl.
I distilled the whole thing down to a trivial registry cgi:
##################################################################
print "Content-type: text/plain\n\n";
my $test = _default_data();
print "length of test is " . length($test) . "\n";
# this block here is directly copied from lines 291-301 of
PublicSuffix.pm
{
my $data;
sub _default_data {
if ( ! defined $data ) {
$data = do { local $/; <DATA> };
$data =~s{^// ===END ICANN DOMAINS.*}{}ms
or die "cannot find END ICANN DOMAINS";
}
return $data;
}
}
__DATA__
// ===BEGIN ICANN DOMAINS===
edu.ac
// zone : 2013-11-14 Outer Falls, LLC
zone
// ===END ICANN DOMAINS===
// ===BEGIN PRIVATE DOMAINS===
za.org
// ===END PRIVATE DOMAINS===
##################################################################
If you run that cgi on the command line, it correctly prints "length
of test is 83"; in a mod_perl environment, it yields:
[Fri Nov 21 11:23:28 2014] [error] cannot find END ICANN DOMAINS at
/usr/local/mysite/www/cgi-bin/test.cgi line 12.\n
My gut-level feeling is that the writers of that code are committing
some mod-perl sin somewhere. The line:
$data = do { local $/; <DATA> };
... yields an empty $data in mod_perl.
The problem is, IO::Socket::SSL is used by LWP::UserAgent, which is
probably used by a ton of mod-perl scripts out there.
My questions, then, are:
1) can you fine folk reproduce this?
2) what would be the best way to address it?
Thanks!
Michael