toddr / Crypt-OpenSSL-RSA

Release history of Crypt-OpenSSL-RSA
https://metacpan.org/pod/Crypt::OpenSSL::RSA
Other
8 stars 25 forks source link

prevent outer $SIG{__DIE__} handler from being called #25

Closed fany closed 4 years ago

fany commented 5 years ago

in case Crypt::OpenSSL::Bignum is not installed

See perldoc -f eval:

            Using the "eval {}" form as an exception trap in libraries
            does have some issues. Due to the current arguably broken
            state of "__DIE__" hooks, you may wish not to trigger any
            "__DIE__" hooks that user code may have installed. You can
            use the "local $SIG{__DIE__}" construct for this purpose, as
            this example shows:

                # a private exception trap for divide-by-zero
                eval { local $SIG{'__DIE__'}; $answer = $a / $b; };
                warn $@ if $@;
atoomic commented 5 years ago

As I understand your patch, you try to protect against a possible custom hook on SIG{__DIE__}. Do you which one you are protecting against?

Are you trying to protect one or more specific hooks coming from a known place or is your patch more generic and provides a protection for a potential hook.

Say it differently, do you have a test case where your patch would be valuable?

thanks for your answer

fany commented 5 years ago

Thanks for your reply!

What happened was that I have a Perl script with a $SIG{__DIE__} handler, and when this script requires Mail::DKIM::Verifier which in turn uses Crypt::OpenSSL::Bignum, the following would happen:

$ perl -E '$SIG{__DIE__}=sub{say "DIED: @_"}; require Mail::DKIM::Verifier'
DIED: Can't locate Crypt/OpenSSL/Bignum.pm in @INC (you may need to install the Crypt::OpenSSL::Bignum module) (@INC contains: /usr/lib/perl5/site_perl/5.26.1/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.26.1 /usr/lib/perl5/vendor_perl/5.26.1/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.26.1 /usr/lib/perl5/5.26.1/x86_64-linux-thread-multi /usr/lib/perl5/5.26.1 /usr/lib/perl5/site_perl) at /usr/lib/perl5/vendor_perl/5.26.1/x86_64-linux-thread-multi/Crypt/OpenSSL/RSA.pm line 17.

I have now also included a test for this scenario.

Regards Martin

atoomic commented 5 years ago

Thanks for providing the unit test which show the problem you try to fix. I'm not going to say that we should not fix it, but I'm afraid this could open a much longer discussion, if we consider your patch

I would say if you're the one who set a hook on die for example as you described there

$SIG{__DIE__}=sub{say "DIED: @_"}; 
require Mail::DKIM::Verifier;

should not we simply patch the caller to run it correctly?

$SIG{__DIE__}=sub{say "DIED: @_"}; 
{ local $SIG{__DIE__}; require Mail::DKIM::Verifier; }

Probably worth waiting for more external feedback there.

I'm not saying you are wrong, and I can be wrong but want to balance pros/cons.

fany commented 5 years ago

why only SIG{DIE}? why not all signals?

Because __DIE__ is not really a signal but an exception handler which, unlike a real signal, could be triggered by an eval.

pushing this idea to the extreme all eval blocks should be protected like this...

This is correct for libraries. See perldoc -f eval.

which I think is uncommon

$ grep -r 'local \$SIG{.*__DIE__' /usr/local/lib/perl5  
/usr/local/lib/perl5/site_perl/5.28.0/File/HomeDir/MacOS9.pm:        local $SIG{'__DIE__'} = '';
/usr/local/lib/perl5/site_perl/5.28.0/File/HomeDir/MacOS9.pm:    local $SIG{'__DIE__'} = '';
/usr/local/lib/perl5/site_perl/5.28.0/File/HomeDir/MacOS9.pm:        local $SIG{'__DIE__'} = '';
/usr/local/lib/perl5/site_perl/5.28.0/File/Temp.pm:      local $SIG{__DIE__} = sub {};
/usr/local/lib/perl5/site_perl/5.28.0/File/Temp.pm:    local $SIG{__DIE__} = sub {};
/usr/local/lib/perl5/site_perl/5.28.0/File/Temp.pm:      local $SIG{__DIE__} = sub {};
/usr/local/lib/perl5/site_perl/5.28.0/File/Copy/Recursive.pm:$CopyLink = eval { local $SIG{'__DIE__'}; symlink '', ''; 1 } || 0;
/usr/local/lib/perl5/site_perl/5.28.0/File/Copy/Recursive/Reduced.pm:our $Link       = eval { local $SIG{'__DIE__'}; link    '', ''; 1 } || 0;
/usr/local/lib/perl5/site_perl/5.28.0/File/Copy/Recursive/Reduced.pm:our $CopyLink   = eval { local $SIG{'__DIE__'}; symlink '', ''; 1 } || 0;
/usr/local/lib/perl5/site_perl/5.28.0/Plack/Middleware/StackTrace.pm:    local $SIG{__DIE__} = sub {
/usr/local/lib/perl5/site_perl/5.28.0/Plack/App/WrapCGI.pm:                local $SIG{__DIE__} = sub {
/usr/local/lib/perl5/site_perl/5.28.0/Test/Builder.pm:        local $SIG{__DIE__};    # don't trip an outside DIE handler.
/usr/local/lib/perl5/site_perl/5.28.0/Test/Deep/Cache/Simple.pm:    local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/Log/Log4perl/Util.pm:    local $SIG{__DIE__} = sub {};
/usr/local/lib/perl5/site_perl/5.28.0/Net/DNS/Resolver/Base.pm:         local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/Net/DNS/Packet.pm:                local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/Net/DNS/Packet.pm:                local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/Net/DNS/Packet.pm:                local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/Net/DNS/RR.pm:            local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/Net/DNS/ZoneFile.pm:      local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/Net/DNS/ZoneFile.pm:              local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/Net/DNS/Update.pm:                local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/Net/HTTP/Methods.pm:    local $SIG{__DIE__};    
/usr/local/lib/perl5/site_perl/5.28.0/Net/HTTP/Methods.pm:    local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/Net/DNS.pm:local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/Sys/Info/Device.pm:    local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/XML/Twig.pm:{ local $SIG{__DIE__};      
/usr/local/lib/perl5/site_perl/5.28.0/XML/Twig.pm:      local $SIG{__DIE__};  
/usr/local/lib/perl5/site_perl/5.28.0/XML/Twig.pm:  { local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/XML/Twig.pm:      { local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/XML/Twig.pm:    { local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/Text/Unidecode.pm:    local $SIG{'__DIE__'};
/usr/local/lib/perl5/site_perl/5.28.0/Text/Reform.pm:           elsif (!defined eval { local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/Test2/Util.pm:    local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/LWP/ConnCache.pm:    local $SIG{__DIE__};  # don't interfere with eval below
/usr/local/lib/perl5/site_perl/5.28.0/LWP/RobotUA.pm:    my $netloc = eval { local $SIG{__DIE__}; $request->uri->host_port; };
/usr/local/lib/perl5/site_perl/5.28.0/Module/Build/Platform/VMS.pm:    if (eval { local $SIG{__DIE__}; require VMS::Feature; }) {
/usr/local/lib/perl5/site_perl/5.28.0/Module/Runtime.pm:        eval { local $SIG{__DIE__}; require_module($name); };
/usr/local/lib/perl5/site_perl/5.28.0/HTTP/Request.pm:          eval { local $SIG{__DIE__}; $uri = $uri->abs; };
/usr/local/lib/perl5/site_perl/5.28.0/Mojo/Template.pm:  local $SIG{__DIE__} = sub {
/usr/local/lib/perl5/site_perl/5.28.0/Perl/Tidy.pm:        local $SIG{__DIE__} = sub {
/usr/local/lib/perl5/site_perl/5.28.0/IO/Socket/SSL.pm: local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/IO/Socket/SSL.pm: local $SIG{__DIE__}; local $SIG{__WARN__}; # be silent
/usr/local/lib/perl5/site_perl/5.28.0/IO/Socket/SSL.pm:    local $SIG{__DIE__}; 
/usr/local/lib/perl5/site_perl/5.28.0/IO/Socket/SSL.pm:    local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/IO/Socket/SSL.pm:    local $SIG{__DIE__}; local $SIG{__WARN__}; # be silent
/usr/local/lib/perl5/site_perl/5.28.0/IO/Socket/SSL.pm:         local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/Try/Tiny.pm:  # FIXME consider using local $SIG{__DIE__} to accumulate all errors. It's
/usr/local/lib/perl5/site_perl/5.28.0/IPC/Run3.pm:        local $SIG{'__DIE__'};
/usr/local/lib/perl5/site_perl/5.28.0/HTML/Mason/Request.pm:    local $SIG{'__DIE__'} = $self->component_error_handler
/usr/local/lib/perl5/site_perl/5.28.0/HTML/Mason/Request.pm:    local $SIG{'__DIE__'} = $self->component_error_handler
/usr/local/lib/perl5/site_perl/5.28.0/DateTime/SpanSet.pm:        local $SIG{__DIE__};   # don't want to trap this (rt ticket 5434)
/usr/local/lib/perl5/site_perl/5.28.0/DateTime/Span.pm:        local $SIG{__DIE__};   # don't want to trap this (rt ticket 5434)
/usr/local/lib/perl5/site_perl/5.28.0/DateTime/TimeZone.pm:                local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/DateTime/TimeZone.pm:        local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/DateTime/TimeZone.pm:        local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/DateTime/TimeZone.pm:        local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/DateTime/TimeZone/Local.pm:            local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/DateTime/TimeZone/Local.pm:                local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/DateTime/TimeZone/Local/Android.pm:        local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/DateTime/TimeZone/Local/Android.pm:        local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/DateTime/TimeZone/Local/Unix.pm:                local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/DateTime/TimeZone/Local/Unix.pm:        local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/DateTime/TimeZone/Local/Unix.pm:        local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/DateTime/TimeZone/Local/Unix.pm:        local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/DateTime/TimeZone/Local/Unix.pm:        local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/DateTime/TimeZone/Local/Unix.pm:        local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/URI/Find.pm:    local $SIG{__DIE__} = 'DEFAULT';
/usr/local/lib/perl5/site_perl/5.28.0/Class/Load.pm:        local $SIG{__DIE__} = 'DEFAULT';
/usr/local/lib/perl5/site_perl/5.28.0/Type/Registry.pm:                 local $SIG{__DIE__} = sub {};
/usr/local/lib/perl5/site_perl/5.28.0/Type/Registry.pm:         local $SIG{__DIE__} = sub {};
/usr/local/lib/perl5/site_perl/5.28.0/Image/Size.pm:        local $SIG{__DIE__} = q{};
/usr/local/lib/perl5/site_perl/5.28.0/Image/Size.pm:        local $SIG{__DIE__} = q{};
/usr/local/lib/perl5/site_perl/5.28.0/Error.pm:    local $SIG{__DIE__} = $old_DIE if ( defined $old_DIE );
/usr/local/lib/perl5/site_perl/5.28.0/Eval/TypeTiny.pm: local $SIG{__DIE__};             
/usr/local/lib/perl5/site_perl/5.28.0/Eval/Closure.pm:    local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/Date/Parse.pm:     local $SIG{__DIE__} = sub {}; # Ick!
/usr/local/lib/perl5/site_perl/5.28.0/Date/Parse.pm:     local $SIG{__DIE__} = sub {}; # Ick!
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/Imager.pm:    local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/Imager.pm:    local $SIG{__DIE__}; # we don't want this processed by confess, etc
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/File/Spec/VMS.pm:    if (eval { local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/Test/LeakTrace.pm:    local $SIG{__DIE__} = 'DEFAULT';
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/Net/DNS/SEC.pm:              local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/Cwd.pm:        if (eval { local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/IO/Pty.pm:eval { local $^W = 0; undef local $SIG{__DIE__}; require IO::Stty };
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/IO/Tty.pm:eval { local $^W = 0; undef local $SIG{__DIE__}; require IO::Stty };
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/AnyEvent.pm:   local $SIG{__DIE__}; # we use eval
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/Lexical/SealRequireHints.pm:} elsif(eval { local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/Lexical/SealRequireHints.pm:         eval { local $SIG{__DIE__}; require($_); 1; };
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/Encode.pm:    local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/DBD/Proxy.pm:    local $SIG{__DIE__} = 'DEFAULT';
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/DBD/Proxy.pm:        local $SIG{__DIE__} = 'DEFAULT';
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/DBD/Proxy.pm:        local $SIG{__DIE__} = 'DEFAULT';
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/DBD/Proxy.pm:    local $SIG{__DIE__} = 'DEFAULT';
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/DBD/Proxy.pm:      local $SIG{__DIE__} = 'DEFAULT';
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/DBD/Proxy.pm:    local $SIG{__DIE__} = 'DEFAULT';
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/DBD/Proxy.pm:    local $SIG{__DIE__} = 'DEFAULT';
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/DBD/Proxy.pm:    local $SIG{__DIE__} = 'DEFAULT';
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/DBD/Proxy.pm:    local $SIG{__DIE__} = 'DEFAULT';
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/DBD/Proxy.pm:        local $SIG{__DIE__} = 'DEFAULT';
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/DBD/Proxy.pm:        local $SIG{__DIE__} = 'DEFAULT';
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/DBD/Proxy.pm:        local $SIG{__DIE__} = 'DEFAULT';
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/DBD/Proxy.pm:        local $SIG{__DIE__} = 'DEFAULT';
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/Class/MOP/Class.pm:        local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/AnyEvent/Log.pm:   local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/AnyEvent/Debug.pm:               local $SIG{__DIE__} = sub {
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/AnyEvent/Handle.pm:      local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/AnyEvent/Handle.pm:      local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/AnyEvent/Handle.pm:#      (eval { local $SIG{__DIE__}; Net::SSLeay::MODE_ENABLE_PARTIAL_WRITE () } || 1)
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/AnyEvent/Handle.pm:#      | (eval { local $SIG{__DIE__}; Net::SSLeay::MODE_ACCEPT_MOVING_WRITE_BUFFER () } || 2));
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/AnyEvent/Util.pm:            local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/AnyEvent/Util.pm:            local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/AnyEvent/Loop.pm:   local $SIG{__DIE__}; # protect us against the many broken __DIE__ handlers out there
/usr/local/lib/perl5/site_perl/5.28.0/x86_64-linux/Params/Validate/PP.pm:                local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/Mojolicious.pm:  local $SIG{__DIE__}
/usr/local/lib/perl5/site_perl/5.28.0/Mail/Internet.pm:    {   local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/Mail/Internet.pm:    {   local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/Mail/Internet.pm:    my $name = eval {local $SIG{__DIE__}; (getpwuid($>))[6]} || $ENV{NAME} ||"";
/usr/local/lib/perl5/site_perl/5.28.0/Devel/StackTrace/Frame.pm:                local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/Devel/StackTrace.pm:    local $SIG{__DIE__};
/usr/local/lib/perl5/site_perl/5.28.0/Devel/StackTrace.pm:        local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/B/Deparse.pm:               } elsif (do { local $@; local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/File/Temp.pm:      local $SIG{__DIE__} = sub {};
/usr/local/lib/perl5/5.28.0/File/Temp.pm:    local $SIG{__DIE__} = sub {};
/usr/local/lib/perl5/5.28.0/File/Temp.pm:      local $SIG{__DIE__} = sub {};
/usr/local/lib/perl5/5.28.0/File/Copy.pm:            local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/TAP/Parser/Iterator/Process.pm:    local $SIG{__DIE__} = undef;
/usr/local/lib/perl5/5.28.0/Test/Builder.pm:        local $SIG{__DIE__};    # don't trip an outside DIE handler.
/usr/local/lib/perl5/5.28.0/Net/Config.pm:  local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/Net/Config.pm:  $ref = eval { local $SIG{__DIE__}; do $file };
/usr/local/lib/perl5/5.28.0/Net/Config.pm:  my $home = eval { local $SIG{__DIE__}; (getpwuid($>))[7] } || $ENV{HOME};
/usr/local/lib/perl5/5.28.0/Net/Config.pm:    $ref       = eval { local $SIG{__DIE__}; do $file } if -f $file;
/usr/local/lib/perl5/5.28.0/Net/POP3.pm:  if (eval { local $SIG{__DIE__}; require Digest::MD5 }) {
/usr/local/lib/perl5/5.28.0/Net/POP3.pm:  elsif (eval { local $SIG{__DIE__}; require MD5 }) {
/usr/local/lib/perl5/5.28.0/Net/POP3.pm:       $user ||= eval { local $SIG{__DIE__}; (getpwuid($>))[0] }
/usr/local/lib/perl5/5.28.0/Net/Domain.pm:    local $SIG{'__DIE__'};
/usr/local/lib/perl5/5.28.0/Net/Domain.pm:  local $SIG{'__DIE__'};
/usr/local/lib/perl5/5.28.0/Exporter/Heavy.pm:    local $SIG{__DIE__} = sub {
/usr/local/lib/perl5/5.28.0/Locale/Maketext.pm:    if ( exists $INC{'utf8.pm'} || eval { local $SIG{'__DIE__'};require utf8; } ) {
/usr/local/lib/perl5/5.28.0/Locale/Maketext.pm:        local $SIG{'__DIE__'};
/usr/local/lib/perl5/5.28.0/Locale/Maketext.pm:        local $SIG{'__DIE__'};
/usr/local/lib/perl5/5.28.0/Locale/Maketext.pm:    local $SIG{'__DIE__'};
/usr/local/lib/perl5/5.28.0/Test2/Util.pm:    local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/Carp.pm:                local $SIG{__DIE__} = sub{};
/usr/local/lib/perl5/5.28.0/Carp.pm:            local $SIG{__DIE__} = sub{};
/usr/local/lib/perl5/5.28.0/Carp.pm:            local $SIG{__DIE__} = sub{};
/usr/local/lib/perl5/5.28.0/Carp.pm:        local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/AutoLoader.pm:    eval { local $SIG{__DIE__}; require $filename };
/usr/local/lib/perl5/5.28.0/AutoLoader.pm:              eval { local $SIG{__DIE__}; require $filename };
/usr/local/lib/perl5/5.28.0/CPAN.pm:  local $SIG{__DIE__} = '';
/usr/local/lib/perl5/5.28.0/Getopt/Long.pm:                         local $SIG{__DIE__}  = 'DEFAULT';
/usr/local/lib/perl5/5.28.0/Getopt/Long.pm:                 local $SIG{__DIE__}  = 'DEFAULT';
/usr/local/lib/perl5/5.28.0/pod/perlfunc.pod:You can use the C<local $SIG{__DIE__}> construct for this purpose,
/usr/local/lib/perl5/5.28.0/pod/perlfunc.pod:    eval { local $SIG{'__DIE__'}; $answer = $a / $b; };
/usr/local/lib/perl5/5.28.0/pod/perlfunc.pod:       local $SIG{'__DIE__'} =
/usr/local/lib/perl5/5.28.0/base.pm:                local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/I18N/LangTags/Detect.pm:    local $SIG{'__DIE__'};
/usr/local/lib/perl5/5.28.0/ExtUtils/Command.pm:    if (eval { local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/ExtUtils/MakeMaker/version.pm:    local $SIG{'__DIE__'};
/usr/local/lib/perl5/5.28.0/ExtUtils/Manifest.pm:    if (eval { local $SIG{__DIE__}; require VMS::Feature; }) {
/usr/local/lib/perl5/5.28.0/ExtUtils/MakeMaker.pm:    local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/perl5db.pl:    local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/perl5db.pl:            local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/perl5db.pl:            local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/perl5db.pl:                    local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/perl5db.pl:            local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/perl5db.pl:    local $SIG{__DIE__}  = '';
/usr/local/lib/perl5/5.28.0/perl5db.pl:    local $SIG{__DIE__}  = '';
/usr/local/lib/perl5/5.28.0/x86_64-linux/File/Spec/VMS.pm:    if (eval { local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/x86_64-linux/Sys/Syslog.pm:            if (eval { local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/x86_64-linux/Sys/Syslog.pm:            if (eval { local $SIG{__DIE__}; getservbyname('syslog', 'udp') }) {
/usr/local/lib/perl5/5.28.0/x86_64-linux/Sys/Syslog.pm:            || eval { local $SIG{__DIE__}; getservbyname('syslog',   'tcp') }
/usr/local/lib/perl5/5.28.0/x86_64-linux/Sys/Syslog.pm:            || eval { local $SIG{__DIE__}; getservbyname('syslogng', 'tcp') };
/usr/local/lib/perl5/5.28.0/x86_64-linux/Sys/Syslog.pm:            || eval { local $SIG{__DIE__}; getservbyname('syslog', 'udp') };
/usr/local/lib/perl5/5.28.0/x86_64-linux/Sys/Hostname.pm:       local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/x86_64-linux/Sys/Hostname.pm:    eval { local $SIG{__DIE__}; $host = (gethostbyname('me'))[0] };
/usr/local/lib/perl5/5.28.0/x86_64-linux/Sys/Hostname.pm:       local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/x86_64-linux/Sys/Hostname.pm:       local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/x86_64-linux/Sys/Hostname.pm:       local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/x86_64-linux/Sys/Hostname.pm:       local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/x86_64-linux/Sys/Hostname.pm:       local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/x86_64-linux/Cwd.pm:        if (eval { local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/x86_64-linux/Storable.pm:        local $SIG{__DIE__};
/usr/local/lib/perl5/5.28.0/x86_64-linux/Encode.pm:    local $SIG{__DIE__};

I wouldn't call that uncommon. :-)

should not we simply patch the caller to run it correctly?

No, you should simply read perldoc -f eval and note that it recommends exactly to do what my patch does. :-) (See my initial post.)

Furthermore, you cannot fix this on the caller side, because:

moritz commented 5 years ago

should not we simply patch the caller to run it correctly?

Libraries generally exist to remove burdens from the caller, and put them into the module. So in general, I agree with the sentiment of making the library more robust, which in this case implies adding the $SIG{__DIE__} handler.