git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>
To: Liam Breck <liam@networkimprov.net>
Cc: Git Mailing List <git@vger.kernel.org>
Subject: Re: send-email: Net::SMTP::SSL failure
Date: Wed, 7 Jun 2017 21:30:05 +0200	[thread overview]
Message-ID: <CACBZZX5dwUq58nghuMqnuGfe9sPm1VBxVwZGZcTCYgeO5OdyTg@mail.gmail.com> (raw)
In-Reply-To: <CAKvHMgRpS3AgRAm1ukH18kX5jNF6PEU8YTsq7mQ36myQgRe=Pw@mail.gmail.com>

On Wed, Jun 7, 2017 at 8:04 PM, Liam Breck <liam@networkimprov.net> wrote:
> Thanks for your help!
>
> On Wed, Jun 7, 2017 at 10:16 AM, Ævar Arnfjörð Bjarmason
> <avarab@gmail.com> wrote:
>> On Wed, Jun 7, 2017 at 7:00 PM, Liam Breck <liam@networkimprov.net> wrote:
>>> On Tue, Jun 6, 2017 at 10:47 PM, Liam Breck <liam@networkimprov.net> wrote:
>>>>
>>>> This is configured to send via a gmail account
>>>> git send-email --to-cover --cc-cover <patch-list>
>>>>
>>>> I See
>>>> Attempt to reload IO/Socket/SSL.pm aborted.
>>>> Compilation failed in require at
>>>> /usr/share/perl5/vendor_perl/Net/SMTP/SSL.pm line 6.
>>>> BEGIN failed--compilation aborted at
>>>> /usr/share/perl5/vendor_perl/Net/SMTP/SSL.pm line 6.
>>>> Compilation failed in require at /usr/lib/git-core/git-send-email line 1386.
>>>> fatal: 'send-email' appears to be a git command, but we were not
>>>> able to execute it. Maybe git-send-email is broken?
>>>>
>>>> Net/SMTP/SSL.pm v1.04
>>>>
>>>> perl v5.26.0
>>>>
>>>> Seen in git 2.11.1, 2.12.2, 2.13.0, 2.13.1 on Arch Linux
>>>
>>> Also fails with perl 5.24.1 & 5.24.0
>>>
>>> Last working config was git 2.9.3 on perl 5.24.1
>>>
>>> The relevant code from git-send-email is:
>>>
>>>             require Net::SMTP;
>>>             $smtp_domain ||= maildomain();
>>>             $smtp_server_port ||= 25;
>>>             $smtp ||= Net::SMTP->new($smtp_server,
>>>                          Hello => $smtp_domain,
>>>                          Debug => $debug_net_smtp,
>>>                          Port => $smtp_server_port);
>>>             if ($smtp_encryption eq 'tls' && $smtp) {
>>>                 require Net::SMTP::SSL;
>>>                 $smtp->command('STARTTLS');
>>>
>>> I really wish git bundled its non-core perl libs...
>>
>> What's the output from just:
>>
>>     perl -MNet::SMTP -we1
>
> No output, exit code 0, however...
>
> $ perl -MIO::Socket::SSL -we1
> Can't load '/usr/lib/perl5/site_perl/auto/Net/SSLeay/SSLeay.so' for
> module Net::SSLeay: libssl.so.1.0.0: cannot open shared object file:
> No such file or directory at /usr/lib/perl5/core_perl/DynaLoader.pm
> line 193.
> at /usr/share/perl5/vendor_perl/IO/Socket/SSL.pm line 19.
> Compilation failed in require at
> /usr/share/perl5/vendor_perl/IO/Socket/SSL.pm line 19.
> BEGIN failed--compilation aborted at
> /usr/share/perl5/vendor_perl/IO/Socket/SSL.pm line 19.
> Compilation failed in require.
> BEGIN failed--compilation aborted.
>
> I don't have {vendor,site}_perl/auto/ tho I have the package for
> ssleay installed.
>
> Since which git release was that required?

The actual issue here is that your Net::SSLeay package is broken
because it's linked to libssl.so.1.0.0 which has since gone away. You
should see that it's missing if you run whatever the Arch equivalent
is of these Debian commands:

    $ dpkg -L libnet-ssleay-perl|grep \.so$
    /usr/lib/x86_64-linux-gnu/perl5/5.24/auto/Net/SSLeay/SSLeay.so
    $ /usr/bin/perldoc -l Net::SSLeay
    /usr/lib/x86_64-linux-gnu/perl5/5.24/Net/SSLeay.pod
    $ dpkg -S /usr/lib/x86_64-linux-gnu/perl5/5.24/Net/SSLeay.pod
    libnet-ssleay-perl: /usr/lib/x86_64-linux-gnu/perl5/5.24/Net/SSLeay.pod
    $ dpkg -L libnet-ssleay-perl|grep \.so$
    /usr/lib/x86_64-linux-gnu/perl5/5.24/auto/Net/SSLeay/SSLeay.so
    $ ldd -r /usr/lib/x86_64-linux-gnu/perl5/5.24/auto/Net/SSLeay/SSLeay.so
2>&1|grep libssl
            libssl.so.1.1 => /usr/lib/x86_64-linux-gnu/libssl.so.1.1
(0x00007f2523bb5000)
    $ dpkg -S /usr/lib/x86_64-linux-gnu/libssl.so.1.1
    libssl1.1:amd64: /usr/lib/x86_64-linux-gnu/libssl.so.1.1

But that this isn't reported is a bug in git-send-email. This
(untested) patch is probably the least invasive and easiest way to
deal with this:

diff --git a/git-send-email.perl b/git-send-email.perl
index 7fd5874436..3f0fcf9040 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -1354,6 +1354,8 @@ EOF
                        die __("The required SMTP server is not
properly defined.")
                }

+               delete $INC{"Net/SMTP.pm"} if exists $INC{"Net/SMTP.pm"}
+                                             and !defined $INC{"Net/SMTP.pm"};
                require Net::SMTP;
                my $use_net_smtp_ssl =
version->parse($Net::SMTP::VERSION) < version->parse("2.34");
                $smtp_domain ||= maildomain();

on closer inspection none of the other require() uses in that script
are run twice, so they don't have the same issue with hiding the
initial error.


>> I have not looked deeply at this, but the error you're getting means
>> "we tried to load it before and failed, and here you are trying
>> again".
>>
>> This is almost definitely due to this line in git-send-email:
>>
>>         if (eval { require Net::SMTP; 1 }) {
>>
>> And more generally, this code is all buggy:
>>
>>     4 matches for "eval.*require" in buffer: git-send-email.perl
>>     153:my $have_email_valid = eval { require Email::Valid; 1 };
>>     154:my $have_mail_address = eval { require Mail::Address; 1 };
>>    1118:        if (eval { require Net::Domain; 1 }) {
>>    1129:        if (eval { require Net::SMTP; 1 }) {
>>
>> Well, "buggy" in the sense that we're just happy-go-lucky trying to
>> load these modules, and if they have an error we don't report it, then
>> when we try to load them again perl just emits a generic error saying
>> you're trying to require() something that already failed somewhere
>> before, a minimal test case for that is:
>>
>>     $ cat /tmp/Fails.pm
>>     package Fails;
>>     die "oh noes";
>>     $ perl -I/tmp -we 'eval { require Fails }; require Fails'
>>     Attempt to reload Fails.pm aborted.
>>     Compilation failed in require at -e line 1.
>>
>> Whereas what we really want to do is some variant of:
>>
>>     $ perl -MData::Dumper -I/tmp -we 'eval { require Fails } or warn
>> $@; require Fails'
>>     oh noes at /tmp/Fails.pm line 2.
>>     Compilation failed in require at -e line 1.
>>     Attempt to reload Fails.pm aborted.
>>     Compilation failed in require at -e line 1.
>>
>> Or even the more adventerous, this can have some bad side-effects with
>> some libraries (you lie to perl saying you haven't seen it before),
>> but I doubt Net::SMTP cares much, particularly when we're just about
>> to report an error:
>>
>>     $ perl -MData::Dumper -I/tmp -we 'eval { require Fails } or do {
>> delete $INC{"Fails.pm"} }; require Fails'
>>     oh noes at /tmp/Fails.pm line 2.
>>     Compilation failed in require at -e line 1.

  reply	other threads:[~2017-06-07 19:30 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-07  5:47 send-email: Net::SMTP::SSL failure Liam Breck
2017-06-07 17:00 ` Liam Breck
2017-06-07 17:16   ` Ævar Arnfjörð Bjarmason
2017-06-07 18:04     ` Liam Breck
2017-06-07 19:30       ` Ævar Arnfjörð Bjarmason [this message]
2017-06-07 19:39         ` Liam Breck
2017-06-07 20:43           ` Ævar Arnfjörð Bjarmason
2017-06-07 21:06             ` Liam Breck
2017-06-08  0:06             ` Samuel Lijin
2017-06-08  0:26               ` Liam Breck
2017-06-08  6:28               ` Ævar Arnfjörð Bjarmason
2017-06-09 16:37     ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CACBZZX5dwUq58nghuMqnuGfe9sPm1VBxVwZGZcTCYgeO5OdyTg@mail.gmail.com \
    --to=avarab@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=liam@networkimprov.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).