projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix crash in nested callbacks (#4038)
[ghc-hetmet.git]
/
rts
/
posix
/
Signals.c
diff --git
a/rts/posix/Signals.c
b/rts/posix/Signals.c
index
3b93fcc
..
4bb1255
100644
(file)
--- a/
rts/posix/Signals.c
+++ b/
rts/posix/Signals.c
@@
-135,6
+135,12
@@
ioManagerDie (void)
}
}
}
}
+Capability *
+ioManagerStartCap (Capability *cap)
+{
+ return rts_evalIO(cap,&base_GHCziConc_ensureIOManagerIsRunning_closure,NULL);
+}
+
void
ioManagerStart (void)
{
void
ioManagerStart (void)
{
@@
-142,7
+148,7
@@
ioManagerStart (void)
Capability *cap;
if (io_manager_pipe < 0) {
cap = rts_lock();
Capability *cap;
if (io_manager_pipe < 0) {
cap = rts_lock();
- cap = rts_evalIO(cap,&base_GHCziConc_ensureIOManagerIsRunning_closure,NULL);
+ cap = ioManagerStartCap(cap);
rts_unlock(cap);
}
}
rts_unlock(cap);
}
}
@@
-177,7
+183,14
@@
generic_handler(int sig USED_IF_THREADS,
int r;
buf[0] = sig;
int r;
buf[0] = sig;
- memcpy(buf+1, info, sizeof(siginfo_t));
+
+ if (info == NULL) {
+ // info may be NULL on Solaris (see #3790)
+ memset(buf+1, 0, sizeof(siginfo_t));
+ } else {
+ memcpy(buf+1, info, sizeof(siginfo_t));
+ }
+
r = write(io_manager_pipe, buf, sizeof(siginfo_t)+1);
if (r == -1 && errno == EAGAIN)
{
r = write(io_manager_pipe, buf, sizeof(siginfo_t)+1);
if (r == -1 && errno == EAGAIN)
{