]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
hurd: fix restarting reauth_dtable on signal
authorSamuel Thibault <samuel.thibault@ens-lyon.org>
Mon, 20 Nov 2023 23:55:54 +0000 (00:55 +0100)
committerSamuel Thibault <samuel.thibault@ens-lyon.org>
Mon, 20 Nov 2023 23:55:54 +0000 (00:55 +0100)
While inside the critical section, RPCs would not be restarted, so we
have to handle EINTR errors.

hurd/dtable.c

index 41f4d7afefddd6c2b6ab45f1971bec3d37f476f7..eaf4734a35637e9a99f043dbd238dbdb73260d89 100644 (file)
@@ -289,6 +289,7 @@ reauth_dtable (void)
 {
   int i;
 
+retry:
   HURD_CRITICAL_BEGIN;
   __mutex_lock (&_hurd_dtable_lock);
 
@@ -296,6 +297,7 @@ reauth_dtable (void)
     {
       struct hurd_fd *const d = _hurd_dtable[i];
       mach_port_t new, newctty, ref;
+      error_t err = 0;
 
       if (d == NULL)
        /* Nothing to do for an unused descriptor cell.  */
@@ -308,23 +310,23 @@ reauth_dtable (void)
 
       /* Reauthenticate the descriptor's port.  */
       if (d->port.port != MACH_PORT_NULL
-         && ! __io_reauthenticate (d->port.port,
-                                   ref, MACH_MSG_TYPE_MAKE_SEND)
-         && ! __USEPORT (AUTH, __auth_user_authenticate
-                         (port,
-                          ref, MACH_MSG_TYPE_MAKE_SEND,
-                          &new)))
+         && ! (err = __io_reauthenticate (d->port.port,
+                                          ref, MACH_MSG_TYPE_MAKE_SEND))
+         && ! (err = __USEPORT (AUTH, __auth_user_authenticate
+                                (port,
+                                 ref, MACH_MSG_TYPE_MAKE_SEND,
+                                 &new))))
        {
          /* Replace the port in the descriptor cell
             with the newly reauthenticated port.  */
 
          if (d->ctty.port != MACH_PORT_NULL
-             && ! __io_reauthenticate (d->ctty.port,
-                                       ref, MACH_MSG_TYPE_MAKE_SEND)
-             && ! __USEPORT (AUTH, __auth_user_authenticate
-                             (port,
-                              ref, MACH_MSG_TYPE_MAKE_SEND,
-                              &newctty)))
+             && ! (err = __io_reauthenticate (d->ctty.port,
+                                              ref, MACH_MSG_TYPE_MAKE_SEND))
+             && ! (err = __USEPORT (AUTH, __auth_user_authenticate
+                                    (port,
+                                     ref, MACH_MSG_TYPE_MAKE_SEND,
+                                     &newctty))))
            _hurd_port_set (&d->ctty, newctty);
 
          _hurd_port_locked_set (&d->port, new);
@@ -334,6 +336,15 @@ reauth_dtable (void)
        __spin_unlock (&d->port.lock);
 
       __mach_port_destroy (__mach_task_self (), ref);
+
+      if (err == EINTR)
+       {
+         /* Got a signal while inside an RPC of the critical section,
+            retry again */
+         __mutex_unlock (&_hurd_dtable_lock);
+         HURD_CRITICAL_UNLOCK;
+         goto retry;
+       }
     }
 
   __mutex_unlock (&_hurd_dtable_lock);