1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-08 17:42:12 +03:00

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.
This commit is contained in:
Samuel Thibault
2021-03-23 22:38:54 +00:00
parent a4ea18ec6c
commit c3b287be74
29 changed files with 139 additions and 4 deletions

View File

@@ -31,6 +31,7 @@ seteuids (int n, const uid_t *uids)
for (i = 0; i < n; ++i)
new[i] = uids[i];
retry:
HURD_CRITICAL_BEGIN;
__mutex_lock (&_hurd_id.lock);
err = _hurd_check_ids ();
@@ -47,6 +48,9 @@ seteuids (int n, const uid_t *uids)
}
__mutex_unlock (&_hurd_id.lock);
HURD_CRITICAL_END;
if (err == EINTR)
/* Got a signal while inside an RPC of the critical section, retry again */
goto retry;
if (err)
return __hurd_fail (err);