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:
@@ -34,6 +34,7 @@ setgroups (size_t n, const gid_t *groups)
|
||||
for (i = 0; i < n; ++i)
|
||||
new[i] = groups[i];
|
||||
|
||||
retry:
|
||||
HURD_CRITICAL_BEGIN;
|
||||
__mutex_lock (&_hurd_id.lock);
|
||||
err = _hurd_check_ids ();
|
||||
@@ -50,6 +51,9 @@ setgroups (size_t n, const gid_t *groups)
|
||||
}
|
||||
__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);
|
||||
|
Reference in New Issue
Block a user