diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c index cf83cc637271b25a997e2e5b5ebb10c25fd9d179..bfa805d944f7b309428b6818b7160215c1b8e9fc 100644 --- a/src/pl/plperl/plperl.c +++ b/src/pl/plperl/plperl.c @@ -24,11 +24,13 @@ #include "commands/trigger.h" #include "executor/spi.h" #include "funcapi.h" +#include "libpq/pqsignal.h" #include "mb/pg_wchar.h" #include "miscadmin.h" #include "nodes/makefuncs.h" #include "parser/parse_type.h" #include "storage/ipc.h" +#include "tcop/tcopprot.h" #include "utils/builtins.h" #include "utils/fmgroids.h" #include "utils/guc.h" @@ -742,6 +744,18 @@ plperl_init_interp(void) char *dummy_env[1] = {NULL}; PERL_SYS_INIT3(&nargs, (char ***) &embedding, (char ***) &dummy_env); + + /* + * For unclear reasons, PERL_SYS_INIT3 sets the SIGFPE handler to + * SIG_IGN. Aside from being extremely unfriendly behavior for a + * library, this is dumb on the grounds that the results of a + * SIGFPE in this state are undefined according to POSIX, and in + * fact you get a forced process kill at least on Linux. Hence, + * restore the SIGFPE handler to the backend's standard setting. + * (See Perl bug 114574 for more information.) + */ + pqsignal(SIGFPE, FloatExceptionHandler); + perl_sys_init_done = 1; /* quiet warning if PERL_SYS_INIT3 doesn't use the third argument */ dummy_env[0] = NULL;