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

hurd: Use the new __proc_reauthenticate_complete protocol

This commit is contained in:
Sergey Bugaev
2025-02-01 18:17:38 +01:00
committed by Samuel Thibault
parent 96429bcc91
commit a7aad6e2b7
2 changed files with 66 additions and 23 deletions

View File

@@ -1611,28 +1611,53 @@ _hurdsig_init (const int *intarray, size_t intarraysize)
static void static void
reauth_proc (mach_port_t new) reauth_proc (mach_port_t new)
{ {
mach_port_t ref, ignore; error_t err;
mach_port_t ref, newproc;
ref = __mach_reply_port (); ref = __mach_reply_port ();
if (! HURD_PORT_USE (&_hurd_ports[INIT_PORT_PROC], err = HURD_PORT_USE (&_hurd_ports[INIT_PORT_PROC],
__proc_reauthenticate (port, ref, __proc_reauthenticate (port, ref,
MACH_MSG_TYPE_MAKE_SEND) MACH_MSG_TYPE_MAKE_SEND));
|| __auth_user_authenticate (new, ref, if (err)
MACH_MSG_TYPE_MAKE_SEND, {
&ignore)) __mach_port_destroy (__mach_task_self (), ref);
&& ignore != MACH_PORT_NULL) return;
__mach_port_deallocate (__mach_task_self (), ignore); }
__mach_port_destroy (__mach_task_self (), ref);
/* Set the owner of the process here too. */ err = __auth_user_authenticate (new, ref,
__mutex_lock (&_hurd_id.lock); MACH_MSG_TYPE_MAKE_SEND,
if (!_hurd_check_ids ()) &newproc);
HURD_PORT_USE (&_hurd_ports[INIT_PORT_PROC], __mach_port_destroy (__mach_task_self (), ref);
__proc_setowner (port, if (err)
(_hurd_id.gen.nuids return;
? _hurd_id.gen.uids[0] : 0),
!_hurd_id.gen.nuids)); if (newproc == MACH_PORT_NULL)
__mutex_unlock (&_hurd_id.lock); {
/* Old versions of the proc server did not recreate the process
port when reauthenticating, and passed MACH_PORT_NULL through
the auth server. That must be what we're dealing with. */
/* Set the owner of the process here too. */
__mutex_lock (&_hurd_id.lock);
if (!_hurd_check_ids ())
HURD_PORT_USE (&_hurd_ports[INIT_PORT_PROC],
__proc_setowner (port,
(_hurd_id.gen.nuids
? _hurd_id.gen.uids[0] : 0),
!_hurd_id.gen.nuids));
__mutex_unlock (&_hurd_id.lock);
return;
}
err = __proc_reauthenticate_complete (newproc);
if (err)
{
__mach_port_deallocate (__mach_task_self (), newproc);
return;
}
_hurd_port_set (&_hurd_ports[INIT_PORT_PROC], newproc);
(void) &reauth_proc; /* Silence compiler warning. */ (void) &reauth_proc; /* Silence compiler warning. */
} }

View File

@@ -679,11 +679,29 @@ retry:
ref, MACH_MSG_TYPE_MAKE_SEND, ref, MACH_MSG_TYPE_MAKE_SEND,
&newproc); &newproc);
__mach_port_destroy (__mach_task_self (), ref); __mach_port_destroy (__mach_task_self (), ref);
if (!err) if (err)
{ goto out;
__mach_port_deallocate (__mach_task_self (), proc); if (newproc == MACH_PORT_NULL)
proc = newproc; {
} /* Old versions of the proc server did not recreate the process
port when reauthenticating, and passed MACH_PORT_NULL through
the auth server. That must be what we're dealing with. Just
keep the existing proc port in this case. */
}
else
{
err = __proc_reauthenticate_complete (newproc);
if (err)
{
__mach_port_deallocate (__mach_task_self (), newproc);
goto out;
}
else
{
__mach_port_deallocate (__mach_task_self (), proc);
proc = newproc;
}
}
if (!err) if (!err)
err = reauthenticate (INIT_PORT_CRDIR, &rcrdir); err = reauthenticate (INIT_PORT_CRDIR, &rcrdir);