aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/mach/hurd/spawni.c
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2021-03-23 22:38:54 +0000
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2021-03-23 22:40:10 +0000
commitc3b287be74e12bdb15ed36e98d24fd42f8ee9122 (patch)
tree82a9f85685a35bf5b12e480ee6ed1abc24103dc8 /sysdeps/mach/hurd/spawni.c
parenta4ea18ec6cc3f1370efab09bc18c1badbf74aa13 (diff)
downloadglibc-c3b287be74e12bdb15ed36e98d24fd42f8ee9122.tar
glibc-c3b287be74e12bdb15ed36e98d24fd42f8ee9122.tar.gz
glibc-c3b287be74e12bdb15ed36e98d24fd42f8ee9122.tar.bz2
glibc-c3b287be74e12bdb15ed36e98d24fd42f8ee9122.zip
hurd: handle EINTR during critical sections
During critical sections, signal handling is deferred and thus RPCs return EINTR, even if SA_RESTART is set. We thus have to restart the whole critical section in that case. This also adds HURD_CRITICAL_UNLOCK in the cases where one wants to break the section in the middle.
Diffstat (limited to 'sysdeps/mach/hurd/spawni.c')
-rw-r--r--sysdeps/mach/hurd/spawni.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/sysdeps/mach/hurd/spawni.c b/sysdeps/mach/hurd/spawni.c
index 9bc1571c29..b5c92365f2 100644
--- a/sysdeps/mach/hurd/spawni.c
+++ b/sysdeps/mach/hurd/spawni.c
@@ -333,6 +333,7 @@ __spawni (pid_t *pid, const char *file,
ss = _hurd_self_sigstate ();
+retry:
assert (! __spin_lock_locked (&ss->critical_section_lock));
__spin_lock (&ss->critical_section_lock);
@@ -437,7 +438,19 @@ __spawni (pid_t *pid, const char *file,
MACH_PORT_RIGHT_SEND, +1));
if (err)
- goto out;
+ {
+ _hurd_critical_section_unlock (ss);
+
+ if (err == EINTR)
+ {
+ /* Got a signal while inside an RPC of the critical section, retry again */
+ __mach_port_deallocate (__mach_task_self (), auth);
+ auth = MACH_PORT_NULL;
+ goto retry;
+ }
+
+ goto out;
+ }
/* Pack up the descriptor table to give the new program.
These descriptors will need to be reauthenticated below