summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJérémie Dimino <jeremie@dimino.org>2013-05-14 15:37:48 +0000
committerJérémie Dimino <jeremie@dimino.org>2013-05-14 15:37:48 +0000
commitd69bd84bb38d29795f95960afffd4bdf0d1bd723 (patch)
treeeb73372b00e61148994274c6f5e5f6b448b17f6b
parent200f97fef60e6053716fdbd84f276f0d1f682242 (diff)
PR#5982: save and restore the value of errno in signal handlers
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@13667 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
-rw-r--r--asmrun/signals_asm.c5
-rw-r--r--byterun/signals_byt.c7
2 files changed, 11 insertions, 1 deletions
diff --git a/asmrun/signals_asm.c b/asmrun/signals_asm.c
index fb22f8baf..a1ef94268 100644
--- a/asmrun/signals_asm.c
+++ b/asmrun/signals_asm.c
@@ -17,6 +17,7 @@
#define _GNU_SOURCE
#endif
#include <signal.h>
+#include <errno.h>
#include <stdio.h>
#include "fail.h"
#include "memory.h"
@@ -73,6 +74,9 @@ void caml_garbage_collection(void)
DECLARE_SIGNAL_HANDLER(handle_signal)
{
+ int saved_errno;
+ /* Save the value of errno (PR#5982). */
+ saved_errno = errno;
#if !defined(POSIX_SIGNALS) && !defined(BSD_SIGNALS)
signal(sig, handle_signal);
#endif
@@ -90,6 +94,7 @@ DECLARE_SIGNAL_HANDLER(handle_signal)
CONTEXT_YOUNG_LIMIT = (context_reg) caml_young_limit;
#endif
}
+ errno = saved_errno;
}
int caml_set_signal_action(int signo, int action)
diff --git a/byterun/signals_byt.c b/byterun/signals_byt.c
index cd0c0ebdf..9703afaa6 100644
--- a/byterun/signals_byt.c
+++ b/byterun/signals_byt.c
@@ -14,6 +14,7 @@
/* Signal handling, code specific to the bytecode interpreter */
#include <signal.h>
+#include <errno.h>
#include "config.h"
#include "memory.h"
#include "osdeps.h"
@@ -49,6 +50,9 @@ void caml_process_event(void)
static void handle_signal(int signal_number)
{
+ int saved_errno;
+ /* Save the value of errno (PR#5982). */
+ saved_errno = errno;
#if !defined(POSIX_SIGNALS) && !defined(BSD_SIGNALS)
signal(signal_number, handle_signal);
#endif
@@ -58,7 +62,8 @@ static void handle_signal(int signal_number)
caml_enter_blocking_section_hook();
}else{
caml_record_signal(signal_number);
- }
+ }
+ errno = saved_errno;
}
int caml_set_signal_action(int signo, int action)