aboutsummaryrefslogtreecommitdiff
path: root/hurd/hurdsig.c
diff options
context:
space:
mode:
Diffstat (limited to 'hurd/hurdsig.c')
-rw-r--r--hurd/hurdsig.c61
1 files changed, 43 insertions, 18 deletions
diff --git a/hurd/hurdsig.c b/hurd/hurdsig.c
index 8b1928d..2f04f0a 100644
--- a/hurd/hurdsig.c
+++ b/hurd/hurdsig.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991-2024 Free Software Foundation, Inc.
+/* Copyright (C) 1991-2025 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -1611,28 +1611,53 @@ _hurdsig_init (const int *intarray, size_t intarraysize)
static void
reauth_proc (mach_port_t new)
{
- mach_port_t ref, ignore;
+ error_t err;
+ mach_port_t ref, newproc;
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,
- MACH_MSG_TYPE_MAKE_SEND)
- || __auth_user_authenticate (new, ref,
- MACH_MSG_TYPE_MAKE_SEND,
- &ignore))
- && ignore != MACH_PORT_NULL)
- __mach_port_deallocate (__mach_task_self (), ignore);
+ MACH_MSG_TYPE_MAKE_SEND));
+ if (err)
+ {
+ __mach_port_destroy (__mach_task_self (), ref);
+ return;
+ }
+
+ err = __auth_user_authenticate (new, ref,
+ MACH_MSG_TYPE_MAKE_SEND,
+ &newproc);
__mach_port_destroy (__mach_task_self (), ref);
+ if (err)
+ return;
+
+ if (newproc == MACH_PORT_NULL)
+ {
+ /* 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;
+ }
- /* 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);
+ _hurd_port_set (&_hurd_ports[INIT_PORT_PROC], newproc);
(void) &reauth_proc; /* Silence compiler warning. */
}