Carl Fredrik Hammar, le Tue 29 Dec 2009 23:01:06 +0100, a écrit :
> On Mon, Dec 28, 2009 at 03:24:52AM +0100, Samuel Thibault wrote:
> > Carl Fredrik Hammar, le Sun 27 Dec 2009 20:56:21 +0100, a écrit :
> > > If the notification request is canceled before auth_user_authenticate
> > > returns there should be no problem.
> >
> > I tried a crude
> >
> > error_t err2 = mach_port_request_notification(mach_task_self(),
> > rendezvous, MACH_NOTIFY_DEAD_NAME, 0, MACH_PORT_NULL,
> > MACH_MSG_TYPE_MAKE_SEND_ONCE, &old);
> >
> > after the complete if (hurd_condition_wait (&s.wakeup, &pending_lock)
> > statement, with no luck: ext2fs got an EINTR anyway.
>
> Err, shouldn't be in the user part after it finds the pending server if
> we want to do it before auth_user_authenticate returns?
That's the same. To make it clearer, see attached patch.
Samuel
--- auth.c.orig 2009-12-29 23:07:54.000000000 +0100
+++ auth.c 2009-12-29 23:08:41.000000000 +0100
@@ -328,18 +328,19 @@
condition_init (&u.wakeup);
ports_interrupt_self_on_port_death (userauth, rendezvous);
if (hurd_condition_wait (&u.wakeup, &pending_lock)
&& hurd_ihash_find (&pending_users, rendezvous))
/* We were interrupted; remove our record. */
{
hurd_ihash_locp_remove (&pending_users, u.locp);
err = EINTR;
}
+ error_t err2 = mach_port_request_notification(mach_task_self(),
rendezvous, MACH_NOTIFY_DEAD_NAME, 0, MACH_PORT_NULL,
MACH_MSG_TYPE_MAKE_SEND_ONCE, &old);
}
/* The server side has already removed U from the ihash table. */
mutex_unlock (&pending_lock);
if (! err)
{
/* The server RPC has set the port and signalled U.wakeup. */
*newport = u.passthrough;
*newporttype = MACH_MSG_TYPE_MOVE_SEND;
@@ -410,18 +411,19 @@
condition_init (&s.wakeup);
ports_interrupt_self_on_port_death (serverauth, rendezvous);
if (hurd_condition_wait (&s.wakeup, &pending_lock)
&& hurd_ihash_find (&pending_servers, rendezvous))
/* We were interrupted; remove our record. */
{
hurd_ihash_locp_remove (&pending_servers, s.locp);
err = EINTR;
}
+ error_t err2 = mach_port_request_notification(mach_task_self(),
rendezvous, MACH_NOTIFY_DEAD_NAME, 0, MACH_PORT_NULL,
MACH_MSG_TYPE_MAKE_SEND_ONCE, &old);
}
/* The user side has already removed S from the ihash table. */
mutex_unlock (&pending_lock);
if (err)
return err;
/* The user RPC has set the port (with a ref) and signalled S.wakeup. */
user = s.user;