Hello!

Here are a few places where the return value of mach_port_insert_right was
not checked.  I’m not entirely sure if I’m handling the error correctly in
every instance.  Also, I’d like to know whether the return value of
mach_port_mod_refs should be checked as well.

Thanks,

--
Mikhail Karpov
From 2a704a491da5efeebda6c4a3d5c4f5b26581eb91 Mon Sep 17 00:00:00 2001
From: Mikhail Karpov <[email protected]>
Date: Wed, 21 Oct 2026 16:07:27 +0700
Subject: [PATCH 2/2] Added checks for mach_port_insert_right return value in
 several place

---
 console/pager.c             |  9 ++++--
 eth-multiplexer/ethernet.c  |  6 ++--
 isofs/pager.c               | 10 ++++--
 libdiskfs/disk-pager.c      |  6 ++--
 libirqhelp/irqhelp.c        | 14 ++++++---
 lwip/port/netif/hurdethif.c |  7 +++--
 pfinet/ethernet.c           |  6 ++--
 storeio/pager.c             | 12 +++++--
 term/users.c                | 14 ++++++---
 trans/streamio.c            | 62 ++++++++++++++++++-------------------
 trans/symlink.c             |  7 +++--
 11 files changed, 96 insertions(+), 57 deletions(-)

diff --git a/console/pager.c b/console/pager.c
index a2c9069..8499b82 100644
--- a/console/pager.c
+++ b/console/pager.c
@@ -167,8 +167,13 @@ user_pager_create (struct user_pager *user_pager, unsigned int npages,
   user_pager->memobj = pager_get_port (user_pager->pager);
   ports_port_deref (user_pager->pager);
 
-  mach_port_insert_right (mach_task_self (), user_pager->memobj,
-			  user_pager->memobj, MACH_MSG_TYPE_MAKE_SEND);
+  err = mach_port_insert_right (mach_task_self (), user_pager->memobj,
+				user_pager->memobj, MACH_MSG_TYPE_MAKE_SEND);
+  if (err)
+    {
+      mach_port_deallocate (mach_task_self (), user_pager->memobj);
+      return err;
+    }
 
   *user = 0;
   err = vm_map (mach_task_self (),
diff --git a/eth-multiplexer/ethernet.c b/eth-multiplexer/ethernet.c
index 13f0036..129be7b 100644
--- a/eth-multiplexer/ethernet.c
+++ b/eth-multiplexer/ethernet.c
@@ -135,8 +135,10 @@ int ethernet_open (char *dev_name, device_t master_device,
   if (err)
     error (2, err, "ports_create_port");
   readptname = ports_get_right (readpt);
-  mach_port_insert_right (mach_task_self (), readptname, readptname,
-			  MACH_MSG_TYPE_MAKE_SEND);
+  err = mach_port_insert_right (mach_task_self (), readptname, readptname,
+				MACH_MSG_TYPE_MAKE_SEND);
+  if (err)
+    error (2, err, "mach_port_insert_right");
 
   mach_port_set_qlimit (mach_task_self (), readptname, MACH_PORT_QLIMIT_MAX);
 
diff --git a/isofs/pager.c b/isofs/pager.c
index 621214c..7b36f36 100644
--- a/isofs/pager.c
+++ b/isofs/pager.c
@@ -214,8 +214,14 @@ diskfs_get_filemap (struct node *np, vm_prot_t prot)
   
   pthread_spin_unlock (&node2pagelock);
   
-  mach_port_insert_right (mach_task_self (), right, right, 
-			  MACH_MSG_TYPE_MAKE_SEND);
+  error_t err = mach_port_insert_right (mach_task_self (), right, right,
+					MACH_MSG_TYPE_MAKE_SEND);
+  if (err)
+    {
+      mach_port_deallocate (mach_task_self (), right);
+      errno = err;
+      return MACH_PORT_NULL;
+    }
   
   return right;
 }
diff --git a/libdiskfs/disk-pager.c b/libdiskfs/disk-pager.c
index 6eaa3c6..0a6076c 100644
--- a/libdiskfs/disk-pager.c
+++ b/libdiskfs/disk-pager.c
@@ -62,8 +62,10 @@ diskfs_start_disk_pager (struct user_pager_info *upi,
 
   /* Get a port to the disk pager.  */
   disk_pager_port = pager_get_port (diskfs_disk_pager);
-  mach_port_insert_right (mach_task_self (), disk_pager_port, disk_pager_port,
-			  MACH_MSG_TYPE_MAKE_SEND);
+  err = mach_port_insert_right (mach_task_self (), disk_pager_port,
+				disk_pager_port, MACH_MSG_TYPE_MAKE_SEND);
+  if (err)
+    error (2, err, "mach_port_insert_right");
 
   /* Now map the disk image.  */
   *image = 0;
diff --git a/libirqhelp/irqhelp.c b/libirqhelp/irqhelp.c
index 5a563a1..b94fc61 100644
--- a/libirqhelp/irqhelp.c
+++ b/libirqhelp/irqhelp.c
@@ -366,9 +366,15 @@ irqhelp_remove_interrupt_handler(struct irq *irq)
   irq->shutdown = true;
 
   /* Turn port into dead name */
-  mach_port_insert_right (mach_task_self (), irq->port, irq->port,
-                          MACH_MSG_TYPE_MAKE_SEND);
-  mach_port_mod_refs (mach_task_self (), irq->port,
-                      MACH_PORT_RIGHT_RECEIVE, -1);
+  error_t err = mach_port_insert_right (mach_task_self (), irq->port,
+					irq->port, MACH_MSG_TYPE_MAKE_SEND);
+  if (err)
+    return err;
+
+  err = mach_port_mod_refs (mach_task_self (), irq->port,
+			    MACH_PORT_RIGHT_RECEIVE, -1);
+  if (err)
+    return err;
+
   return 0;
 }
diff --git a/lwip/port/netif/hurdethif.c b/lwip/port/netif/hurdethif.c
index 0370281..6444662 100644
--- a/lwip/port/netif/hurdethif.c
+++ b/lwip/port/netif/hurdethif.c
@@ -174,8 +174,11 @@ hurdethif_device_open (struct netif *netif)
   else
     {
       ethif->readptname = ports_get_right (ethif->readpt);
-      mach_port_insert_right (mach_task_self (), ethif->readptname,
-			      ethif->readptname, MACH_MSG_TYPE_MAKE_SEND);
+      err = mach_port_insert_right (mach_task_self (), ethif->readptname,
+				    ethif->readptname,
+				    MACH_MSG_TYPE_MAKE_SEND);
+      if (err)
+        error (0, err, "mach_port_insert_right");
 
       mach_port_set_qlimit (mach_task_self (), ethif->readptname,
 			    MACH_PORT_QLIMIT_MAX);
diff --git a/pfinet/ethernet.c b/pfinet/ethernet.c
index bba8ff6..132513d 100644
--- a/pfinet/ethernet.c
+++ b/pfinet/ethernet.c
@@ -207,8 +207,10 @@ ethernet_open (struct device *dev)
 			   sizeof (struct port_info), &edev->readpt);
   assert_perror_backtrace (err);
   edev->readptname = ports_get_right (edev->readpt);
-  mach_port_insert_right (mach_task_self (), edev->readptname, edev->readptname,
-			  MACH_MSG_TYPE_MAKE_SEND);
+  err = mach_port_insert_right (mach_task_self (), edev->readptname,
+				edev->readptname, MACH_MSG_TYPE_MAKE_SEND);
+  if (err)
+    error (2, err, "mach_port_insert_right");
 
   mach_port_set_qlimit (mach_task_self (), edev->readptname, MACH_PORT_QLIMIT_MAX);
 
diff --git a/storeio/pager.c b/storeio/pager.c
index 10bdd1c..7a26efa 100644
--- a/storeio/pager.c
+++ b/storeio/pager.c
@@ -256,9 +256,15 @@ dev_get_memory_object (struct dev *dev, vm_prot_t prot, memory_object_t *memobj)
 	  return dev_get_memory_object (dev, prot, memobj);
 	}
       else
-	err =
-	  mach_port_insert_right (mach_task_self (),
-				  *memobj, *memobj, MACH_MSG_TYPE_MAKE_SEND);
+	{
+	  err = mach_port_insert_right (mach_task_self (), *memobj, *memobj,
+					MACH_MSG_TYPE_MAKE_SEND);
+	  if (err)
+	    {
+	      mach_port_deallocate (mach_task_self (), *memobj);
+	      *memobj = MACH_PORT_NULL;
+	    }
+	}
 
       if (created)
 	ports_port_deref (dev->pager);
diff --git a/term/users.c b/term/users.c
index 445196a..4ff334d 100644
--- a/term/users.c
+++ b/term/users.c
@@ -101,9 +101,11 @@ init_users (void)
     error (1, err, "mach_port_allocate");
 
   /* Add a send right, since hurd_sig_post needs one.  */
-  mach_port_insert_right (mach_task_self (),
-			  async_icky_id, async_icky_id,
-			  MACH_MSG_TYPE_MAKE_SEND);
+  err = mach_port_insert_right (mach_task_self (),
+				async_icky_id, async_icky_id,
+				MACH_MSG_TYPE_MAKE_SEND);
+  if (err)
+    error (1, err, "mach_port_insert_right");
 
   err = mach_port_allocate (mach_task_self (), MACH_PORT_RIGHT_RECEIVE,
 			    &async_id);
@@ -111,8 +113,10 @@ init_users (void)
     error (1, err, "mach_port_allocate");
 
   /* Add a send right, since hurd_sig_post needs one.  */
-  mach_port_insert_right (mach_task_self (),
-			  async_id, async_id, MACH_MSG_TYPE_MAKE_SEND);
+  err = mach_port_insert_right (mach_task_self (), async_id, async_id,
+				MACH_MSG_TYPE_MAKE_SEND);
+  if (err)
+    error (1, err, "mach_port_insert_right");
 }
 
 
diff --git a/trans/streamio.c b/trans/streamio.c
index 694da06..57bbf04 100644
--- a/trans/streamio.c
+++ b/trans/streamio.c
@@ -834,14 +834,13 @@ dev_open (const char *name, dev_mode_t mode)
   err = ports_create_port (phys_reply_class, streamdev_bucket,
 			   sizeof (struct port_info), &phys_reply_pi);
   if (err)
-    {
-      mach_port_deallocate (mach_task_self (), device_master);
-      return err;
-    }
+    goto device_master_deallocate;
 
   phys_reply = ports_get_right (phys_reply_pi);
-  mach_port_insert_right (mach_task_self (), phys_reply, phys_reply,
-			  MACH_MSG_TYPE_MAKE_SEND);
+  err = mach_port_insert_right (mach_task_self (), phys_reply, phys_reply,
+				MACH_MSG_TYPE_MAKE_SEND);
+  if (err)
+    goto phys_reply_deallocate;
 
   if (output_buffer)
     {
@@ -849,40 +848,41 @@ dev_open (const char *name, dev_mode_t mode)
 			       sizeof (struct port_info),
 			       &phys_reply_writes_pi);
       if (err)
-	{
-	  mach_port_deallocate (mach_task_self (), phys_reply);
-	  phys_reply = MACH_PORT_NULL;
-	  ports_port_deref (phys_reply_pi);
-	  phys_reply_pi = 0;
-	  mach_port_deallocate (mach_task_self (), device_master);
-	  return err;
-	}
+	goto phys_reply_deallocate;
 
       phys_reply_writes = ports_get_right (phys_reply_writes_pi);
-      mach_port_insert_right (mach_task_self (), phys_reply_writes,
-			      phys_reply_writes, MACH_MSG_TYPE_MAKE_SEND);
+      err = mach_port_insert_right (mach_task_self (), phys_reply_writes,
+				    phys_reply_writes,
+				    MACH_MSG_TYPE_MAKE_SEND);
+      if (err)
+	goto phys_reply_writes_deallocate;
     }
 
   err = device_open_request (device_master, phys_reply, mode, (char *) name);
   if (err)
-    {
-      mach_port_deallocate (mach_task_self (), phys_reply);
-      phys_reply = MACH_PORT_NULL;
-      ports_port_deref (phys_reply_pi);
-      phys_reply_pi = 0;
-      if (output_buffer)
-	{
-	  mach_port_deallocate (mach_task_self (), phys_reply_writes);
-	  phys_reply_writes = MACH_PORT_NULL;
-	  ports_port_deref (phys_reply_writes_pi);
-	  phys_reply_writes_pi = 0;
-	}
-      mach_port_deallocate (mach_task_self (), device_master);
-      return err;
-    }
+    goto phys_reply_writes_deallocate;
 
   open_pending = 1;
   return 0;
+
+ phys_reply_writes_deallocate:
+  if (output_buffer)
+    {
+      mach_port_deallocate (mach_task_self (), phys_reply_writes);
+      phys_reply_writes = MACH_PORT_NULL;
+      ports_port_deref (phys_reply_writes_pi);
+      phys_reply_writes_pi = 0;
+    }
+
+ phys_reply_deallocate:
+  mach_port_deallocate (mach_task_self (), phys_reply);
+  phys_reply = MACH_PORT_NULL;
+  ports_port_deref (phys_reply_pi);
+  phys_reply_pi = 0;
+
+ device_master_deallocate:
+  mach_port_deallocate (mach_task_self (), device_master);
+  return err;
 }
 
 kern_return_t
diff --git a/trans/symlink.c b/trans/symlink.c
index 05612db..536cafd 100644
--- a/trans/symlink.c
+++ b/trans/symlink.c
@@ -90,8 +90,11 @@ main (int argc, char **argv)
   if (err)
     error (1, err, "mach_port_allocate");
 
-  mach_port_insert_right (mach_task_self (), control, control,
-			  MACH_MSG_TYPE_MAKE_SEND);
+  err = mach_port_insert_right (mach_task_self (), control, control,
+				MACH_MSG_TYPE_MAKE_SEND);
+  if (err)
+    error (1, err, "mach_port_insert_right");
+
   err =
     fsys_startup (bootstrap, 0, control, MACH_MSG_TYPE_COPY_SEND, &realnode);
   mach_port_deallocate (mach_task_self (), control);
-- 
2.43.0

Reply via email to