Re: plperl sigfpe reset can crash the server - Mailing list pgsql-hackers

From Andres Freund
Subject Re: plperl sigfpe reset can crash the server
Date
Msg-id 201208240745.59432.andres@2ndquadrant.com
Whole thread Raw
In response to Re: plperl sigfpe reset can crash the server  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: plperl sigfpe reset can crash the server
List pgsql-hackers
On Friday, August 24, 2012 07:33:01 AM Tom Lane wrote:
> Andres Freund <andres@2ndquadrant.com> writes:
> >> Um ... how exactly can that happen, if the signal is now ignored?
> > 
> > My man 2 signal tells me:
> > "According  to POSIX, the behavior of a process is undefined after it
> > ignores a SIGFPE, SIGILL, or SIGSEGV signal that was not generated by
> > kill(2) or raise(3)."
> 
> So I guess the real question there is: WTF is perl doing setting the
> handling to SIG_IGN?
> 
> Even if you grant the proposition that perl knows what it's doing in
> terms of its internal behavior, which given the above seems doubtful,
> it has no business overriding a host application's signal settings
> like that.

./pod/perl581delta.pod:
At startup Perl blocks the SIGFPE signal away since there isn't much
Perl can do about it.  Previously this blocking was in effect also for
programs executed from within Perl.  Now Perl restores the original
SIGFPE handling routine, whatever it was, before running external
programs.

perl.h also has some tidbits:

/** initialise to avoid floating-point exceptions from overflow, etc*/
#ifndef PERL_FPU_INIT
#  ifdef HAS_FPSETMASK
#    if HAS_FLOATINGPOINT_H
#      include <floatingpoint.h>
#    endif
/* Some operating systems have this as a macro, which in turn expands to a 
comma  expression, and the last sub-expression is something that gets calculated,  and then they have the gall to warn
thata value computed is not used. 
 
Hence  cast to void.  */
#    define PERL_FPU_INIT (void)fpsetmask(0)
#  else
#    if defined(SIGFPE) && defined(SIG_IGN) && !defined(PERL_MICRO)
#      define PERL_FPU_INIT       PL_sigfpe_saved = (Sighandler_t) 
signal(SIGFPE, SIG_IGN)
#      define PERL_FPU_PRE_EXEC   { Sigsave_t xfpe; rsignal_save(SIGFPE, 
PL_sigfpe_saved, &xfpe);
#      define PERL_FPU_POST_EXEC    rsignal_restore(SIGFPE, &xfpe); }
#    else
#      define PERL_FPU_INIT

#    endif
#  endif
#endif
#ifndef PERL_FPU_PRE_EXEC
#  define PERL_FPU_PRE_EXEC   {
#  define PERL_FPU_POST_EXEC  }
#endif

That doesn't sound very well reasoned and especially not very well tested to 
me.

Andres
-- Andres Freund                       http://www.2ndQuadrant.com/PostgreSQL Development, 24x7 Support, Training &
Services



pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: plperl sigfpe reset can crash the server
Next
From: Heikki Linnakangas
Date:
Subject: Re: pg_upgrade's exec_prog() coding improvement