Closed fany closed 4 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
Thanks for your reply!
What happened was that I have a Perl script with a $SIG{__DIE__}
handler, and when this script require
s Mail::DKIM::Verifier which in turn use
s 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
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
local %SIG
eval
blocks should be protected like this... which I think is uncommonI 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.
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:
eval
something.$SIG{__DIE__}
handler also would not be called for fatal exceptions (outside of eval
blocks), which, of course, it should. (Because that's the whole purpose of such a handler.) – So each call would additionally have to be wrapped in its own eval
.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.
in case Crypt::OpenSSL::Bignum is not installed
See
perldoc -f eval
: