Hello, On Fri, 30 Oct 2026 01:13:14 Samuel Thibault wrote:
> You could call mach_port_mod_refs even before the first > mach_port_request_notification. If it fails, we have nothing to do. Then > we try mach_port_request_notification. If it fails, we just have to > deallocate transbox->active once to undo the mod_refs, and return. If it > succeeds, then we can just finish the rest of the operations and return > success. Yes, that simplifies everything a great deal. Thanks, -- Mikhail Karpov
From ecaf71e44f219589609b440c597397dd8c4b9389 Mon Sep 17 00:00:00 2001 From: Mikhail Karpov <[email protected]> Date: Fri, 30 Oct 2026 17:18:30 +0700 Subject: [PATCH 2/2] Added checks for mach_port_mod_refs return value in several place --- libfshelp/translator-list.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/libfshelp/translator-list.c b/libfshelp/translator-list.c index 6d4f941..0777fef 100644 --- a/libfshelp/translator-list.c +++ b/libfshelp/translator-list.c @@ -128,14 +128,24 @@ fshelp_set_active_translator (struct port_info *pi, update: if (MACH_PORT_VALID (transbox->active) && transbox->active != t->active) { + err = mach_port_mod_refs (mach_task_self (), transbox->active, + MACH_PORT_RIGHT_SEND, +1); + if (err) + goto out; + mach_port_t old; - err = mach_port_request_notification (mach_task_self (), transbox->active, + err = mach_port_request_notification (mach_task_self (), + transbox->active, MACH_NOTIFY_DEAD_NAME, 0, pi->port_right, MACH_MSG_TYPE_MAKE_SEND_ONCE, &old); if (err) - goto out; + { + mach_port_deallocate (mach_task_self (), transbox->active); + goto out; + } + if (MACH_PORT_VALID (old)) mach_port_deallocate (mach_task_self (), old); @@ -147,8 +157,7 @@ fshelp_set_active_translator (struct port_info *pi, if (MACH_PORT_VALID (t->active)) mach_port_deallocate (mach_task_self (), t->active); - mach_port_mod_refs (mach_task_self (), transbox->active, - MACH_PORT_RIGHT_SEND, +1); + t->active = transbox->active; } else if (! MACH_PORT_VALID (transbox->active)) -- 2.43.0
