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

Reply via email to