Bug#685157: error: Socket version 1.95 required--this is only version 1.94

Salvatore Bonaccorso carnil at debian.org
Thu Sep 6 20:11:28 UTC 2012


Hi Gregor

I debugged this a bit further and the problem seems to me more that as
you said spamassassin 'is wrong', as IO::Socket::SSL is checking
correctly his alternatives ...

The messages:

Sep  6 21:25:12.103 [9244] error: Socket version 1.95 required--this is only version 1.94 at /usr/share/perl5/IO/Socket/SSL.pm line 71.
Sep  6 21:25:12.103 [9244] error: Can't locate IO/Socket/IP.pm in @INC (@INC contains: /usr/share/perl5 /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl) at /usr/share/perl5/IO/Socket/SSL.pm line 85.

are outputed in:

113 BEGIN {
114   # redirect __WARN__ and __DIE__
115   # do not trap warnings here based on eval scope; evals are very
116   # common throughout.  die()s can be trapped though.
117   $SIG{__WARN__} = sub {
118     log_message("warn", $_[0]);
119   };
120   $SIG{__DIE__} = sub {
121     # see http://use.perl.org/comments.pl?mode=flat&sid=33872 for $^S
122     log_message("error", $_[0]) unless $^S;
123   };
124 }

And log_message is loaded by:

89 use Mail::SpamAssassin::Logger qw(:DEFAULT log_message);

Here is an output traced running spamd with --ssl, to see first what
happens:

----cut---------cut---------cut---------cut---------cut---------cut-----
>> /usr/share/perl5/IO/Socket/SSL.pm:74:        } || eval {
>> /usr/share/perl5/IO/Socket/SSL.pm:70:            require Socket;
>> /usr/share/perl5/IO/Socket/SSL.pm:71:            Socket->VERSION(1.95);
>> ./spamd:120:     log_message("error", $_[0]) unless $^S;
>> /usr/share/perl5/Mail/SpamAssassin/Logger.pm:145:   my ($level, @message) = @_;
>> /usr/share/perl5/Mail/SpamAssassin/Logger.pm:155:   if ($level eq "error") {
>> /usr/share/perl5/Mail/SpamAssassin/Logger.pm:157:     return if ($message[0] =~ /__ignore__/);
>> /usr/share/perl5/Mail/SpamAssassin/Logger.pm:161:     my @caller = caller 2;
>> /usr/share/perl5/Mail/SpamAssassin/Logger.pm:162:     return if (defined $caller[3] && defined $caller[0] &&
>> /usr/share/perl5/Mail/SpamAssassin/Logger.pm:167:   return if $LOG_ENTERED;  # avoid recursion on die or warn from within logging
>> /usr/share/perl5/Mail/SpamAssassin/Logger.pm:168:   $LOG_ENTERED = 1;  # no 'returns' from this point on, must clear the flag
>> /usr/share/perl5/Mail/SpamAssassin/Logger.pm:170:   my $message = join(" ", @message);
>> /usr/share/perl5/Mail/SpamAssassin/Logger.pm:171:   $message =~ s/[\r\n]+$//;                # remove any trailing newlines
>> /usr/share/perl5/Mail/SpamAssassin/Logger.pm:175:   my $first = 1;
>> /usr/share/perl5/Mail/SpamAssassin/Logger.pm:176:   foreach my $line (split(/\n/, $message)) {
>> /usr/share/perl5/Mail/SpamAssassin/Logger.pm:179:     $line =~ tr/\x09\x20\x00-\x1f/  _/s;
>> /usr/share/perl5/Mail/SpamAssassin/Logger.pm:180:     if ($first) {
>> /usr/share/perl5/Mail/SpamAssassin/Logger.pm:181:       $first = 0;
>> /usr/share/perl5/Mail/SpamAssassin/Logger.pm:186:     while (my ($name, $object) = each %{ $LOG_SA{method} }) {
>> /usr/share/perl5/Mail/SpamAssassin/Logger.pm:186:     while (my ($name, $object) = each %{ $LOG_SA{method} }) {
>> /usr/share/perl5/Mail/SpamAssassin/Logger.pm:187:       $object->log_message($level, $line);
>> /usr/share/perl5/Mail/SpamAssassin/Logger/Stderr.pm:57:   my ($self, $level, $msg) = @_;
>> /usr/share/perl5/Mail/SpamAssassin/Logger/Stderr.pm:59:   my $timestamp;
>> /usr/share/perl5/Mail/SpamAssassin/Logger/Stderr.pm:60:   my $fmt = $self->{timestamp_fmt};
>> /usr/share/perl5/Mail/SpamAssassin/Logger/Stderr.pm:61:   if (!defined $fmt) {
>> /usr/share/perl5/Mail/SpamAssassin/Logger/Stderr.pm:63:     my $now = Time::HiRes::time;
>> /usr/share/perl5/Mail/SpamAssassin/Logger/Stderr.pm:64:     $timestamp = sprintf("%s:%06.3f",
>> /usr/share/perl5/Mail/SpamAssassin/Logger/Stderr.pm:67:     local $1; $timestamp =~ s/^(\S+\s+)0/$1 /;
>> /usr/share/perl5/Mail/SpamAssassin/Logger/Stderr.pm:67:     local $1; $timestamp =~ s/^(\S+\s+)0/$1 /;
>> /usr/share/perl5/Mail/SpamAssassin/Logger/Stderr.pm:73:   $timestamp .= ' '  if $timestamp ne '';
>> /usr/share/perl5/Mail/SpamAssassin/Logger/Stderr.pm:75:   my($nwrite) = syswrite(STDERR, sprintf("%s[%d] %s: %s\n",
Sep  6 21:12:28.658 [9216] error: Socket version 1.95 required--this is only version 1.94 at /usr/share/perl5/IO/Socket/SSL.pm line 71.
>> /usr/share/perl5/Mail/SpamAssassin/Logger/Stderr.pm:77:   defined $nwrite  or warn "error writing to log file: $!";
>> /usr/share/perl5/Mail/SpamAssassin/Logger.pm:186:     while (my ($name, $object) = each %{ $LOG_SA{method} }) {
>> /usr/share/perl5/Mail/SpamAssassin/Logger.pm:190:   $LOG_ENTERED = 0;
>> /usr/share/perl5/IO/Socket/SSL.pm:75:            require Socket6;
>> /usr/share/perl5/IO/Socket/SSL.pm:76:            Socket6->import( 'inet_pton' );
>> /usr/share/perl/5.14/Exporter.pm:29:   my $pkg = shift;
>> /usr/share/perl/5.14/Exporter.pm:30:   my $callpkg = caller($ExportLevel);
>> /usr/share/perl/5.14/Exporter.pm:32:   if ($pkg eq "Exporter" and @_ and $_[0] eq "import") {
>> /usr/share/perl/5.14/Exporter.pm:38:   my $exports = \@{"$pkg\::EXPORT"};
>> /usr/share/perl/5.14/Exporter.pm:38:   my $exports = \@{"$pkg\::EXPORT"};
>> /usr/share/perl/5.14/Exporter.pm:41:   my $fail = ${$pkg . '::'}{EXPORT_FAIL} && \@{"$pkg\::EXPORT_FAIL"};
>> /usr/share/perl/5.14/Exporter.pm:41:   my $fail = ${$pkg . '::'}{EXPORT_FAIL} && \@{"$pkg\::EXPORT_FAIL"};
>> /usr/share/perl/5.14/Exporter.pm:42:   return export $pkg, $callpkg, @_
>> /usr/share/perl/5.14/Exporter.pm:44:   my $export_cache = ($Cache{$pkg} ||= {});
>> /usr/share/perl/5.14/Exporter.pm:45:   my $args = @_ or @_ = @$exports;
>> /usr/share/perl/5.14/Exporter.pm:47:   local $_;
>> /usr/share/perl/5.14/Exporter.pm:48:   if ($args and not %$export_cache) {
>> /usr/share/perl/5.14/Exporter.pm:52:   my $heavy;
>> /usr/share/perl/5.14/Exporter.pm:55:   if ($args or $fail) {
>> /usr/share/perl/5.14/Exporter.pm:58:                  foreach (@_);
>> /usr/share/perl/5.14/Exporter.pm:63:   return export $pkg, $callpkg, ($args ? @_ : ()) if $heavy;
>> /usr/share/perl/5.14/Exporter.pm:65:         sub {require Carp; &Carp::carp} if not $SIG{__WARN__};
>> /usr/share/perl/5.14/Exporter.pm:67:   *{"$callpkg\::$_"} = \&{"$pkg\::$_"} foreach @_;
>> /usr/share/perl/5.14/Exporter.pm:67:   *{"$callpkg\::$_"} = \&{"$pkg\::$_"} foreach @_;
>> /usr/share/perl/5.14/Exporter.pm:67:   *{"$callpkg\::$_"} = \&{"$pkg\::$_"} foreach @_;
>> /usr/share/perl5/IO/Socket/SSL.pm:77:            1;
>> /usr/share/perl5/IO/Socket/SSL.pm:81:        if ( $ip6 ) {
>> /usr/share/perl5/IO/Socket/SSL.pm:85:            if ( eval { require IO::Socket::IP; IO::Socket::IP->VERSION(0.11); } ) {
>> /usr/share/perl5/IO/Socket/SSL.pm:85:            if ( eval { require IO::Socket::IP; IO::Socket::IP->VERSION(0.11); } ) {
>> ./spamd:120:     log_message("error", $_[0]) unless $^S;
[...]

# and here comes the second error log_message
----cut---------cut---------cut---------cut---------cut---------cut-----

The error messages thus are comming when we have the eval in

409 if ( $listen_ssl ) {
410   eval { require IO::Socket::SSL };
411   die "spamd: SSL encryption requested, but IO::Socket::SSL is unavailable ($@)\n"
412     if ($@);
413 
414   if ( !-e $opt{'server-key'} ) {
415     die "spamd: server key file $opt{'server-key'} does not exist\n";
416   }
417   if ( !-e $opt{'server-cert'} ) {
418     die "spamd: server certificate file $opt{'server-cert'} does not exist\n";
419   }
420 }

at line 410. But I added here a Dump of $^S before the eval and after
the eval resulting in the following:

$^S is '0'
Sep  6 21:51:21.233 [9298] error: Socket version 1.95 required--this is only version 1.94 at /usr/share/perl5/IO/Socket/SSL.pm line 71.
Sep  6 21:51:21.233 [9298] error: Can't locate IO/Socket/IP.pm in @INC (@INC contains: /usr/share/perl5 /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at /usr/share/perl5/IO/Socket/SSL.pm line 85.
$^S is '0'

It does not seem to be an error of IO::Socket::SSL to me (but I'm not
expert on this), but rather that Spamassassin is handling $^S here in
'strange' way? I suspect this because overall

        # try to load inet_pton from Socket or Socket6
        my $ip6 = eval {
            require Socket;
            Socket->VERSION(1.95);
            Socket->import( 'inet_pton' );
            1;
        } || eval {
            require Socket6;
            Socket6->import( 'inet_pton' );
            1;
        };

in IO::Socket::SSL is satisfied correctly by Socket6.

Opinions? I would go for reassigning the bug to spamassassin and in
particular lowering the serverity (spamd is started and error messages
are missleading).

Regards,
Salvatore
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.alioth.debian.org/pipermail/pkg-perl-maintainers/attachments/20120906/257c9b5b/attachment-0001.pgp>


More information about the pkg-perl-maintainers mailing list