Re: plperl sigfpe reset can crash the server

Поиск
Список
Период
Сортировка
От Andres Freund
Тема Re: plperl sigfpe reset can crash the server
Дата
Msg-id 201208240745.59432.andres@2ndquadrant.com
обсуждение исходный текст
Ответ на Re: plperl sigfpe reset can crash the server  (Tom Lane <tgl@sss.pgh.pa.us>)
Ответы Re: plperl sigfpe reset can crash the server
Список 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 по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: plperl sigfpe reset can crash the server
Следующее
От: Heikki Linnakangas
Дата:
Сообщение: Re: pg_upgrade's exec_prog() coding improvement