Hello,

Similar to the previous checks, I looked for places where the value returned
by the str(n)dup and asprintf functions was not checked.

Thanks,

--
Mikhail Karpov
From a6d76f6ce4b6963ca19f19252308d7e5b90aa7a8 Mon Sep 17 00:00:00 2001
From: Mikhail Karpov <[email protected]>
Date: Sat, 5 Sep 2026 11:54:25 +0700
Subject: [PATCH 3/3] Added checks for strdup and asprintf return value in
 several place

---
 boot/boot.c                | 14 ++++++++-
 console-client/trans.c     |  6 +++-
 daemons/lmail.c            |  6 ++--
 exec/exec.c                |  2 +-
 fatfs/dir.c                |  4 ++-
 ftpfs/dir.c                | 49 +++++++++++++++++++++---------
 ftpfs/host.c               | 30 ++++++++++++-------
 ftpfs/node.c               | 14 +++++++--
 hostmux/mux.c              | 19 ++++++++++--
 libdiskfs/file-get-trans.c |  8 ++++-
 libftpconn/fname.c         | 10 +++++--
 libftpconn/open.c          |  4 +--
 libmachdev/trivfs_server.c |  7 ++++-
 libstore/device.c          |  3 ++
 nfs/main.c                 |  6 ++--
 pfinet/dummy.c             |  2 ++
 pfinet/ethernet.c          |  4 ++-
 pfinet/tunnel.c            | 17 +++++++++--
 proc/mgt.c                 |  6 +++-
 term/main.c                | 17 ++++++++++-
 trans/fakeroot.c           |  7 +++--
 trans/mtab.c               | 28 ++++++++---------
 trans/random.c             |  3 ++
 trans/remap.c              | 12 ++++++--
 usermux/mux.c              |  9 +++++-
 utils/ftpcp.c              | 31 ++++++++++++-------
 utils/login.c              |  3 ++
 utils/mount.c              | 12 ++++++--
 utils/msgids.c             | 61 +++++++++++++++++++++-----------------
 utils/w.c                  |  9 +++++-
 utils/x.c                  |  8 +++--
 31 files changed, 297 insertions(+), 114 deletions(-)

diff --git a/boot/boot.c b/boot/boot.c
index 54feb33..75407e0 100644
--- a/boot/boot.c
+++ b/boot/boot.c
@@ -329,6 +329,14 @@ add_dev_map (const char *dev_name, const char *dev_file)
 
   map->device_name = strdup (dev_name);
   map->file_name = strdup (dev_file);
+  if (!map->device_name || !map->file_name)
+    {
+      free (map->device_name);
+      free (map->file_name);
+      free (map);
+      return NULL;
+    }
+
   map->next = dev_map_head;
   dev_map_head = map;
   return map;
@@ -706,7 +714,11 @@ main (int argc, char **argv, char **envp)
     if (bootscript)
       read_boot_script (&buf, &amt);
     else
-      buf = strdup (default_boot_script), amt = strlen (default_boot_script);
+      {
+	buf = strdup (default_boot_script);
+	assert_backtrace (buf);
+	amt = strlen (default_boot_script);
+      }
 
     line = p = buf;
     while (1)
diff --git a/console-client/trans.c b/console-client/trans.c
index afdf5ac..7b3e08e 100644
--- a/console-client/trans.c
+++ b/console-client/trans.c
@@ -141,9 +141,13 @@ netfs_attempt_mksymlink (struct iouser *cred, struct node *np,
 {
   if (!np->nn->node)
     {
+      char *symlink_path = strdup (name);
+      if (!symlink_path)
+	return errno;
+
       if (np->nn->symlink_path)
 	free (np->nn->symlink_path);
-      np->nn->symlink_path = strdup (name);
+      np->nn->symlink_path = symlink_path;
       return 0;
     }
   else if (np->nn->node->mksymlink)
diff --git a/daemons/lmail.c b/daemons/lmail.c
index 0402fc6..b48534a 100644
--- a/daemons/lmail.c
+++ b/daemons/lmail.c
@@ -213,8 +213,8 @@ write_header (int out, char *out_name, struct params *params)
   /* Note that the string returned by ctime includes a terminating newline.  */
   time = tv.tv_sec;
   hdr_len = asprintf (&hdr, "From %s %s", params->from, ctime (&time));
-  if (! hdr)
-    return SYSERRX (ENOMEM, "%s", out_name);
+  if (hdr_len == -1)
+    return SYSERRX (errno, "%s", out_name);
 
   ex = bwrite (out, out_name, hdr, hdr_len);
 
@@ -492,6 +492,8 @@ main (int argc, char **argv)
 	exit (ERR ("%d: Unknown uid", uid));
 
       params.from = strdup (pw->pw_name);
+      if (! params.from)
+	exit (ERR ("Failed to allocate memory for params.from"));
     }
 
   if (file)
diff --git a/exec/exec.c b/exec/exec.c
index c0fa86f..a79b483 100644
--- a/exec/exec.c
+++ b/exec/exec.c
@@ -675,7 +675,7 @@ set_name (task_t task, const char *exec_name, pid_t pid)
   else
     size = asprintf (&name, "%s", exec_name);
 
-  if (size == 0)
+  if (size == -1)
     return;
 
   /* This is an internal implementational detail of the GNU Mach kernel.  */
diff --git a/fatfs/dir.c b/fatfs/dir.c
index 1b7bfe0..a0fb1d6 100644
--- a/fatfs/dir.c
+++ b/fatfs/dir.c
@@ -109,7 +109,9 @@ dirscanblock (vm_address_t blockoff, struct node *dp, int idx,
 static int
 fatnamematch (const char *dirname, const char *username, size_t unamelen)
 {
-  char *dn = strdup(dirname);
+  char *dn = strdup (dirname);
+  assert_backtrace (dn);
+
   int dpos = 0;
   int upos = 0;
   int ext = 0;
diff --git a/ftpfs/dir.c b/ftpfs/dir.c
index 72b1a46..57ab433 100644
--- a/ftpfs/dir.c
+++ b/ftpfs/dir.c
@@ -71,6 +71,12 @@ lookup (struct ftpfs_dir *dir, const char *name, int add)
       if (e)
 	{
 	  e->name = strdup (name);
+	  if (!e->name)
+	    {
+	      free (e);
+	      return NULL;
+	    }
+
 	  e->node = 0;
 	  e->dir = dir;
 	  e->stat_timestamp = 0;
@@ -141,9 +147,9 @@ sweep (struct ftpfs_dir *dir)
 }
 
 /* Update the directory entry for NAME to reflect ST and SYMLINK_TARGET.
-   True is returned if successful, or false if there was a memory allocation
-   error.  TIMESTAMP is used to record the time of this update.  */
-static void
+   If successful, 0 is returned; if memory allocation fails, errno is
+   returned.  TIMESTAMP is used to record the time of this update.  */
+static error_t
 update_entry (struct ftpfs_dir_entry *e, const struct stat *st,
 	      const char *symlink_target, time_t timestamp)
 {
@@ -166,9 +172,18 @@ update_entry (struct ftpfs_dir_entry *e, const struct stat *st,
       if (!e->symlink_target || !symlink_target
 	  || strcmp (e->symlink_target, symlink_target) != 0)
 	{
+	  char *buf = NULL;
+
+	  if (symlink_target)
+	    {
+	      buf = strdup (symlink_target);
+	      if (!buf)
+		return errno;
+	    }
+
 	  if (e->symlink_target)
 	    free (e->symlink_target);
-	  e->symlink_target = symlink_target ? strdup (symlink_target) : 0;
+	  e->symlink_target = buf;
 	}
     }
 
@@ -176,6 +191,7 @@ update_entry (struct ftpfs_dir_entry *e, const struct stat *st,
   e->stat.st_ino = ino;
   e->stat.st_fsid = fs->fsid;
   e->stat.st_fstype = FSTYPE_FTP;
+  return 0;
 }
 
 /* Add the timestamp TIMESTAMP to the set used to detect bulk stats, and
@@ -242,9 +258,12 @@ update_ordered_entry (const char *name, const struct stat *st,
   struct ftpfs_dir_entry *e = lookup (dfs->dir, name, 1);
 
   if (! e)
-    return ENOMEM;
+    return errno;
+
+  error_t err = update_entry (e, st, symlink_target, dfs->timestamp);
+  if (err)
+    return err;
 
-  update_entry (e, st, symlink_target, dfs->timestamp);
   e->valid = 1;
 
   if (! e->ordered_self_p)
@@ -381,9 +400,7 @@ update_old_entry (const char *name, const struct stat *st,
   if (strcmp (name, res->entry->name) != 0)
     return EGRATUITOUS;
 
-  update_entry (res->entry, st, symlink_target, res->timestamp);
-
-  return 0;
+  return update_entry (res->entry, st, symlink_target, res->timestamp);
 }
 
 /* Refresh stat information for NODE.  This may actually refresh the whole
@@ -549,9 +566,12 @@ update_new_entry (const char *name, const struct stat *st,
 
   e = lookup (nes->dir, name, 1);
   if (! e)
-    return ENOMEM;
+    return errno;
+
+  error_t err = update_entry (e, st, symlink_target, nes->timestamp);
+  if (err)
+    return err;
 
-  update_entry (e, st, symlink_target, nes->timestamp);
   nes->entry = e;
 
   return 0;
@@ -633,7 +653,7 @@ ftpfs_dir_lookup (struct ftpfs_dir *dir, const char *name,
 		    {
 		      e = lookup (dir, name, 1);
 		      if (! e)
-			err = ENOMEM;
+			err = errno;
 		      else
 			{
 			  e->noent = 1;	/* A negative entry.  */
@@ -724,7 +744,7 @@ ftpfs_dir_null_lookup (struct ftpfs_dir *dir, struct node **node)
 
   e = lookup (dir, "", 1);
   if (! e)
-    return ENOMEM;
+    return errno;
 
   if (! e->noent)
     /* We've got a dir entry, get a node for it.  */
@@ -766,8 +786,9 @@ ftpfs_dir_create (struct ftpfs *fs, struct node *node, const char *rmt_path,
 
   if (! new)
     {
+      error_t err = errno;
       free (new);
-      return ENOMEM;
+      return err;
     }
 
   netfs_nref (node);
diff --git a/ftpfs/host.c b/ftpfs/host.c
index cd6fd4c..1b8ceb4 100644
--- a/ftpfs/host.c
+++ b/ftpfs/host.c
@@ -44,7 +44,7 @@ split_server_name (const char *server, char **host, char **user, char **passwd)
     {
       *host = strdup (sep + 1);
       if (! *host)
-	return ENOMEM;
+	return errno;
       plim = sep - server;
     }
   else
@@ -55,7 +55,7 @@ split_server_name (const char *server, char **host, char **user, char **passwd)
 	{
 	  *host = strndup (server, sep - server);
 	  if (! *host)
-	    return ENOMEM;
+	    return errno;
 	  p = sep + 1;
 	  plim = strlen (p);
 	}
@@ -64,7 +64,7 @@ split_server_name (const char *server, char **host, char **user, char **passwd)
 	{
 	  *host = strdup (server);
 	  if (! *host)
-	    return ENOMEM;
+	    return errno;
 	  return 0;
 	}
     }
@@ -74,16 +74,22 @@ split_server_name (const char *server, char **host, char **user, char **passwd)
   if (sep)
     /* USERNAME:PASSWD */
     {
+      error_t err;
       *user = strndup (p, sep - p);
+      if (! *user)
+	{
+	  err = errno;
+	  free (*host);
+	  return err;
+	}
+
       *passwd = strndup (sep + 1, plim - (sep + 1 - p));
-      if (!*user || !*passwd)
+      if (! *passwd)
 	{
-	  if (*user)
-	    free (*user);
-	  if (*passwd)
-	    free (*passwd);
+	  err = errno;
+	  free (*user);
 	  free (*host);
-	  return ENOMEM;
+	  return err;
 	}
     }
   else
@@ -91,7 +97,11 @@ split_server_name (const char *server, char **host, char **user, char **passwd)
     {
       *user = strndup (p, plim);
       if (! *user)
-	free (*user);
+	{
+	  error_t err = errno;
+	  free (*host);
+	  return err;
+	}
     }
 
   return 0;
diff --git a/ftpfs/node.c b/ftpfs/node.c
index fb85fe5..dc6c44b 100644
--- a/ftpfs/node.c
+++ b/ftpfs/node.c
@@ -42,20 +42,29 @@ ftpfs_create_node (struct ftpfs_dir_entry *e, const char *rmt_path,
   error_t err;
 
   if (! nn)
-    return ENOMEM;
+    return errno;
 
   nn->fs = e->dir->fs;
   nn->dir_entry = e;
   nn->contents = 0;
   nn->dir = 0;
   nn->rmt_path = strdup (rmt_path);
+  if (! nn->rmt_path)
+    {
+      err = errno;
+      free (nn);
+      return err;
+    }
+
   nn->ncache_next = nn->ncache_prev = 0;
 
   new = netfs_make_node (nn);
   if (! new)
     {
+      err = errno;
+      free (nn->rmt_path);
       free (nn);
-      return ENOMEM;
+      return err;
     }
 
   fshelp_touch (&new->nn_stat, TOUCH_ATIME|TOUCH_MTIME|TOUCH_CTIME,
@@ -67,6 +76,7 @@ ftpfs_create_node (struct ftpfs_dir_entry *e, const char *rmt_path,
 
   if (err)
     {
+      free (nn->rmt_path);
       free (nn);
       free (new);
       return err;
diff --git a/hostmux/mux.c b/hostmux/mux.c
index 90630de..4997d39 100644
--- a/hostmux/mux.c
+++ b/hostmux/mux.c
@@ -278,13 +278,28 @@ lookup_addrinfo (struct hostmux *mux, const char *host, struct addrinfo *he,
   struct hostmux_name *nm = malloc (sizeof (struct hostmux_name));
 
   if (! nm)
-    return ENOMEM;
+    return errno;
 
   nm->name = strdup (host);
+  if (! nm->name)
+    {
+      err = errno;
+      free_name (nm);
+      return err;
+    }
+
   if (!he || strcmp (host, he->ai_canonname) == 0)
     nm->canon = nm->name;
   else
-    nm->canon = strdup (he->ai_canonname);
+    {
+      nm->canon = strdup (he->ai_canonname);
+      if (! nm->canon)
+        {
+          err = errno;
+          free_name (nm);
+          return err;
+        }
+    }
 
   err = create_host_node (mux, nm, node);
   if (err)
diff --git a/libdiskfs/file-get-trans.c b/libdiskfs/file-get-trans.c
index 797cefd..793a823 100644
--- a/libdiskfs/file-get-trans.c
+++ b/libdiskfs/file-get-trans.c
@@ -106,7 +106,7 @@ diskfs_S_file_get_translator (struct protid *cred,
   else if (S_ISCHR (np->dn_stat.st_mode) || S_ISBLK (np->dn_stat.st_mode))
     {
       char *buf;
-      unsigned int buflen;
+      int buflen;
 
       if (S_ISCHR (np->dn_stat.st_mode))
 	assert_backtrace (diskfs_shortcut_chrdev);
@@ -119,6 +119,12 @@ diskfs_S_file_get_translator (struct protid *cred,
 			  : _HURD_BLKDEV),
 			 '\0', (int) ((np->dn_stat.st_rdev >> 8) & 0377),
 			 '\0', (int) ((np->dn_stat.st_rdev) & 0377));
+      if (buflen < 0)
+	{
+	  err = errno;
+	  goto out;
+	}
+
       buflen++;			/* terminating nul */
 
       if (buflen > *translen)
diff --git a/libftpconn/fname.c b/libftpconn/fname.c
index 3be6eee..837ada2 100644
--- a/libftpconn/fname.c
+++ b/libftpconn/fname.c
@@ -57,14 +57,18 @@ ftp_conn_basename (struct ftp_conn *conn, const char *composite, char **base)
       char *in = strdup (composite), *out = in;
 
       if (! in)
-	return ENOMEM;
+	return errno;
 
       err = (*conn->syshooks.basename) (conn, &out);
       if (err || out != in)
 	{
 	  if (!err && out >= in && out < in + in_size)
-	    /* OUT uses storage from IN, but not at the beginning.  */
-	    out = strdup (out);
+	    {
+	      /* OUT uses storage from IN, but not at the beginning.  */
+	      out = strdup (out);
+	      if (! out)
+		err = errno;
+	    }
 	  free (in);
 	}
 
diff --git a/libftpconn/open.c b/libftpconn/open.c
index f1a1b85..35d8700 100644
--- a/libftpconn/open.c
+++ b/libftpconn/open.c
@@ -76,14 +76,14 @@ ftp_conn_login (struct ftp_conn *conn)
 	      /* Append a '@' */
 	      pass = strdup (pass);
 	      if (pass)
-		pass = realloc (pass, strlen (pass) + 1);
+		pass = realloc (pass, strlen (pass) + 2);
 	      if (pass)
 		{
 		  strcat (pass, "@");
 		  err = ftp_conn_cmd (conn, "pass", pass, &reply, 0);
 		}
 	      else
-		err = ENOMEM;
+		err = errno;
 	    }
 	}
       if (pass && !p->pass)
diff --git a/libmachdev/trivfs_server.c b/libmachdev/trivfs_server.c
index 5f8ccc8..fec83bc 100644
--- a/libmachdev/trivfs_server.c
+++ b/libmachdev/trivfs_server.c
@@ -449,7 +449,12 @@ machdev_trivfs_init(int argc, char **argv, mach_port_t bootstrap_resume_task,
   if (bootstrap_resume_task != MACH_PORT_NULL)
     {
       if (path)
-	devnode = strdup(path);
+	{
+	  devnode = strdup (path);
+	  if (!devnode)
+	    error (1, errno, "Failed to allocate memory for devnode");
+	}
+
       resume_bootstrap_server(bootstrap_resume_task, name);
 
       /* We need to install as a translator later */
diff --git a/libstore/device.c b/libstore/device.c
index 56f3d93..f0e5cc6 100644
--- a/libstore/device.c
+++ b/libstore/device.c
@@ -131,6 +131,9 @@ dopen (const char *name, device_t *device, int *mod_flags)
   if ( (name[0] == '@') && (pos = strchr (name, ':')) )
     {
       master = strndup (name+1, pos-(name+1));
+      if (!master)
+	return errno;
+
       rest = pos+1;
 
       if (*mod_flags & STORE_HARD_READONLY)
diff --git a/nfs/main.c b/nfs/main.c
index 691d707..6609919 100644
--- a/nfs/main.c
+++ b/nfs/main.c
@@ -261,13 +261,13 @@ netfs_append_args (char **argz, size_t *argz_len)
   if (! err)
     {
       char *fs;
-      if (asprintf (&fs, "%s:%s", host, remote_fs))
+      if (asprintf (&fs, "%s:%s", host, remote_fs) < 0)
+	return errno;
+      else
 	{
 	  err = argz_add (argz, argz_len, fs);
 	  free (fs);
 	}
-      else
-	err = ENOMEM;
     }
 
   return err;
diff --git a/pfinet/dummy.c b/pfinet/dummy.c
index 8830149..1ef59c0 100644
--- a/pfinet/dummy.c
+++ b/pfinet/dummy.c
@@ -92,6 +92,8 @@ setup_dummy_device (char *name, struct device **device)
   *device = dev = &ddev->dev;
 
   dev->name = strdup (name);
+  if (!dev->name)
+    error (2, ENOMEM, "%s", name);
 
   dev->priv = ddev;
   dev->get_stats = dummy_get_stats;
diff --git a/pfinet/ethernet.c b/pfinet/ethernet.c
index 234e900..bba8ff6 100644
--- a/pfinet/ethernet.c
+++ b/pfinet/ethernet.c
@@ -336,13 +336,15 @@ setup_ethernet_device (char *name, struct device **device)
 
   edev = calloc (1, sizeof (struct ether_device));
   if (!edev)
-    error (2, ENOMEM, "%s", name);
+    error (2, errno, "%s", name);
   edev->next = ether_dev;
   ether_dev = edev;
 
   *device = dev = &edev->dev;
 
   dev->name = strdup (name);
+  if (!dev->name)
+    error (2, errno, "%s", name);
   /* Functions.  These ones are the true "hardware layer" in Linux.  */
   dev->open = 0;		/* We set up before calling dev_open.  */
   dev->stop = ethernet_stop;
diff --git a/pfinet/tunnel.c b/pfinet/tunnel.c
index 4301d05..ed5018d 100644
--- a/pfinet/tunnel.c
+++ b/pfinet/tunnel.c
@@ -176,6 +176,8 @@ setup_tunnel_device (char *name, struct device **device)
     base_name = name;
 
   dev->name = strdup (base_name);
+  if (!dev->name)
+    error (2, ENOMEM, "%s", name);
 
   dev->priv = tdev;
   dev->get_stats = tunnel_get_stats;
@@ -198,10 +200,19 @@ setup_tunnel_device (char *name, struct device **device)
   dev_init_buffers (dev);
 
   if (base_name != name)
-    tdev->devname = strdup (name);
+    {
+      tdev->devname = strdup (name);
+      if (!tdev->devname)
+	error (2, ENOMEM, "%s", name);
+    }
   else
-    /* Setting up the translator at /dev/tunX.  */
-    asprintf (&tdev->devname, "/dev/%s", tdev->dev.name);
+    {
+      /* Setting up the translator at /dev/tunX.  */
+      err = asprintf (&tdev->devname, "/dev/%s", tdev->dev.name);
+      if (err == -1)
+	error (2, ENOMEM, "/dev/%s", tdev->dev.name);
+    }
+
   tdev->underlying = file_name_lookup (tdev->devname, O_CREAT|O_NOTRANS, 0664);
 
   if (tdev->underlying == MACH_PORT_NULL)
diff --git a/proc/mgt.c b/proc/mgt.c
index 05af823..b3f7299 100644
--- a/proc/mgt.c
+++ b/proc/mgt.c
@@ -274,7 +274,11 @@ S_proc_child (struct proc *parentp,
       childp->end_code = parentp->end_code;
     }
   if (! childp->exe && parentp->exe)
-    childp->exe = strdup (parentp->exe);
+    {
+      childp->exe = strdup (parentp->exe);
+      if (! childp->exe)
+        return errno;
+    }
 
   if (MACH_PORT_VALID (parentp->p_task_namespace))
     {
diff --git a/term/main.c b/term/main.c
index 4c24ba7..1e661da 100644
--- a/term/main.c
+++ b/term/main.c
@@ -214,11 +214,23 @@ parse_opt (int opt, char *arg, struct argp_state *state)
 	{
 	  free (tty_name);
 	  tty_name = strdup (v->name);
+	  if (!tty_name)
+	    argp_failure (state, 1, errno, "Failed to allocate memory for"
+					   " tty_name");
 	}
       if (state->input == 0)	/* This is startup time.  */
 	{
 	  tty_type = v->type ?: T_HURDIO;
-	  tty_arg = v->arg ? strdup (v->arg) : 0;
+
+	  if (v->arg)
+	    {
+	      tty_arg = strdup (v->arg);
+	      if (!tty_arg)
+		argp_failure (state, 1, errno, "Failed to allocate memory for"
+					       " tty_arg");
+	    }
+	  else
+	    tty_arg = NULL;
 	}
       else if (v->type || v->arg)
 	{
@@ -262,6 +274,9 @@ parse_opt (int opt, char *arg, struct argp_state *state)
 	    }
 	  free (tty_arg);
 	  tty_arg = strdup (v->arg);
+	  if (!tty_arg)
+	    argp_failure (state, 1, errno, "Failed to allocate memory for"
+					   " tty_arg");
 	  error_t err = (*bottom->init) ();
 	  if (err == 0 && (termflags & TTY_OPEN))
 	    err = (*bottom->assert_dtr) ();
diff --git a/trans/fakeroot.c b/trans/fakeroot.c
index 77f61d7..764d6fd 100644
--- a/trans/fakeroot.c
+++ b/trans/fakeroot.c
@@ -660,9 +660,10 @@ netfs_attempt_mkdev (struct iouser *cred, struct node *np,
   char *trans = 0;
   int translen = asprintf (&trans, "%s%c%d%c%d",
 			   S_ISCHR (type) ? _HURD_CHRDEV : _HURD_BLKDEV,
-			   '\0', gnu_dev_major (indexes), '\0', gnu_dev_minor (indexes));
-  if (trans == 0)
-    return ENOMEM;
+			   '\0', gnu_dev_major (indexes),
+			   '\0', gnu_dev_minor (indexes));
+  if (translen == -1)
+    return errno;
   else
     {
       error_t err = file_set_translator (netfs_node_netnode (np)->file,
diff --git a/trans/mtab.c b/trans/mtab.c
index f5cada4..01ef4a4 100644
--- a/trans/mtab.c
+++ b/trans/mtab.c
@@ -158,7 +158,7 @@ get_credentials (void)
 
   uids = malloc (len * sizeof (uid_t));
   if (! uids)
-    return ENOMEM;
+    return errno;
 
   len_ = geteuids (len, uids);
   if (len_ != len)
@@ -172,7 +172,7 @@ get_credentials (void)
 
   gids = malloc (len * sizeof (gid_t));
   if (! gids)
-    return ENOMEM;
+    return errno;
 
   len_ = getgroups (len, gids);
   if (len_ != len)
@@ -294,7 +294,7 @@ mtab_add_entry (struct mtab *mtab, const char *entry, size_t length)
 {
   char *p = realloc (mtab->contents, mtab->contents_len + length + 1);
   if (! p)
-    return ENOMEM;
+    return errno;
 
   memcpy (&p[mtab->contents_len], entry, length);
 
@@ -380,7 +380,7 @@ mtab_populate (struct mtab *mtab, const char *path, mach_port_t control,
   argv = malloc ((count + 1) * sizeof (char *));
   if (! argv)
     {
-      err = ENOMEM;
+      err = errno;
       goto errout;
     }
 
@@ -389,7 +389,7 @@ mtab_populate (struct mtab *mtab, const char *path, mach_port_t control,
   type = strdup (argv[0]);
   if (! type)
     {
-      err = ENOMEM;
+      err = errno;
       goto errout;
     }
 
@@ -425,9 +425,9 @@ mtab_populate (struct mtab *mtab, const char *path, mach_port_t control,
 
   entry_len = asprintf (&entry, "%s %s %s %s 0 0\n", src, path, type,
 			options? options: MNTOPT_DEFAULTS);
-  if (! entry)
+  if (entry_len == -1)
     {
-      err = ENOMEM;
+      err = errno;
       goto errout;
     }
 
@@ -463,7 +463,7 @@ mtab_populate (struct mtab *mtab, const char *path, mach_port_t control,
 			c);
 	if (err == -1)
 	  {
-	    err = ENOMEM;
+	    err = errno;
 	    goto errout;
 	  }
 
@@ -537,7 +537,7 @@ argz_add_device (char **options, size_t *options_len, const char *device)
   char *arg = NULL;
   err = asprintf (&arg, "size=%s", device);
   if (err == -1)
-    return ENOMEM;
+    return errno;
 
   err = argz_add (options, options_len, arg);
 
@@ -582,7 +582,7 @@ map_device_to_path (const char *device, char **path)
       else
 	err = asprintf (path, "/dev/%s", &device[7]);
       if (err == -1)
-	return ENOMEM;
+	return errno;
     }
   else if (strncmp (device, "/dev/", 5) == 0)
     *path = strdup (device);
@@ -590,13 +590,13 @@ map_device_to_path (const char *device, char **path)
     {
       err = asprintf (path, "/dev/%s", device);
       if (err == -1)
-	return ENOMEM;
+	return errno;
     }
   else
     *path = strdup (device);
 
   if (! *path)
-    return ENOMEM;
+    return errno;
 
   return 0;
 }
@@ -631,7 +631,7 @@ open_hook (struct trivfs_peropen *peropen)
 {
   struct mtab *mtab = malloc (sizeof (struct mtab));
   if (mtab == NULL)
-    return ENOMEM;
+    return errno;
 
   /* Hook! */
   peropen->hook = mtab;
@@ -705,7 +705,7 @@ trivfs_S_io_read (struct trivfs_protid *cred,
 	  *data = mmap (0, amount, PROT_READ|PROT_WRITE, MAP_ANON, 0, 0);
 	  if (*data == MAP_FAILED)
 	    {
-	      err = ENOMEM;
+	      err = errno;
 	      goto out;
 	    }
 	}
diff --git a/trans/random.c b/trans/random.c
index 74874c9..b358821 100644
--- a/trans/random.c
+++ b/trans/random.c
@@ -580,6 +580,9 @@ parse_opt (int opt, char *arg, struct argp_state *state)
 
     case 'S':
       seed_file = strdup (arg);
+      if (!seed_file)
+	argp_failure (state, 1, errno, "Failed to allocate memory for"
+				       " seed_file");
       break;
     }
   return 0;
diff --git a/trans/remap.c b/trans/remap.c
index c434a26..470827e 100644
--- a/trans/remap.c
+++ b/trans/remap.c
@@ -118,8 +118,13 @@ parse_opt (int key, char *arg, struct argp_state *state)
         arg++;
 
       if (!remap_from)
-	/* First of a pair */
-	remap_from = strdup (arg);
+        {
+	  /* First of a pair */
+	  remap_from = strdup (arg);
+	  if (!remap_from)
+	    argp_failure (state, 1, errno, "Failed to allocate memory for"
+					   " remap_from");
+        }
       else
 	{
 	  /* Second of a pair */
@@ -129,6 +134,9 @@ parse_opt (int key, char *arg, struct argp_state *state)
 					   " remap");
 	  remap->from = remap_from;
 	  remap->to = strdup (arg);
+	  if (!remap->to)
+	    argp_failure (state, 1, errno, "Failed to allocate memory for"
+					   " remap->to");
 	  remap->next = remaps;
 #ifdef DEBUG
 	  fprintf (stderr, "adding remap %s->%s\n", remap->from, remap->to);
diff --git a/usermux/mux.c b/usermux/mux.c
index c0bda94..bff2d29 100644
--- a/usermux/mux.c
+++ b/usermux/mux.c
@@ -336,9 +336,16 @@ lookup_pwent (struct usermux *mux, const char *user, struct passwd *pw,
   struct usermux_name *nm = malloc (sizeof (struct usermux_name));
 
   if (! nm)
-    return ENOMEM;
+    return errno;
 
   nm->name = strdup (user);
+  if (! nm->name)
+    {
+      err = errno;
+      free_name (nm);
+      return err;
+    }
+
   err = create_user_node (mux, nm, pw, node);
   if (err)
     {
diff --git a/utils/ftpcp.c b/utils/ftpcp.c
index 67ccb1a..bf4758a 100644
--- a/utils/ftpcp.c
+++ b/utils/ftpcp.c
@@ -97,7 +97,7 @@ get_host_conn (char *name, struct ftp_conn_params *params, char **cname)
 
   params->addr = malloc (he->h_length);
   if (! params->addr)
-    error (11, ENOMEM, "%s", name);
+    error (11, errno, "%s", name);
 
   bcopy (he->h_addr_list[0], params->addr, he->h_length);
   params->addr_len = he->h_length;
@@ -108,7 +108,11 @@ get_host_conn (char *name, struct ftp_conn_params *params, char **cname)
     error (12, err, "%s", he->h_name);
 
   if (cname)
-    *cname = strdup (he->h_name);
+    {
+      *cname = strdup (he->h_name);
+      if (! *cname)
+	error (12, errno, "%s", name);
+    }
 
   return conn;
 }
@@ -123,7 +127,7 @@ cp (int src, const char *src_name, int dst, const char *dst_name)
     {
       copy_buf = valloc (COPY_SZ);
       if (! copy_buf)
-	error (13, ENOMEM, "Cannot allocate copy buffer");
+	error (13, errno, "Cannot allocate copy buffer");
     }
 
   while ((rd = read (src, copy_buf, COPY_SZ)) > 0)
@@ -174,7 +178,7 @@ econnect (struct epoint *e, struct ftp_conn_params *def_params, char *name)
       e->conn = get_host_conn (e->name, &e->params, &e->name);
       e->name = realloc (e->name, strlen (e->name) + 1 + strlen (rmt) + 1);
       if (! e->name)
-	error (22, ENOMEM, "Cannot allocate name storage");
+	error (22, errno, "Cannot allocate name storage");
 
       e->conn->hook = name;
 
@@ -193,7 +197,11 @@ econnect (struct epoint *e, struct ftp_conn_params *def_params, char *name)
 	   "%s: Ftp login parameter specified for a local endpoint (%s,%s,%s)",
 	   e->name, e->params.user, e->params.pass, e->params.acct);
   else
-    e->file = strdup (e->name);
+    {
+      e->file = strdup (e->name);
+      if (! e->file)
+	error (20, errno, "%s", e->name);
+    }
 }
 
 static error_t
@@ -254,7 +262,7 @@ eappend (struct epoint *e,
       char *rval = malloc (strlen (dir) + 1 + strlen (name) + 1);
 
       if (! rval)
-	return ENOMEM;
+	return errno;
 
       if (dir[0] == '/' && dir[1] == '\0')
 	stpcpy (stpcpy (rval, dir), name);
@@ -276,11 +284,12 @@ ebasename (struct epoint *e, const char *composite, char **base)
 {
   if (e->conn)
     return ftp_conn_basename (e->conn, composite, base);
-  else
-    {
-      *base = strdup (basename (composite));
-      return 0;
-    }
+
+  *base = strdup (basename (composite));
+  if (! *base)
+    return errno;
+
+  return 0;
 }
 
 static void
diff --git a/utils/login.c b/utils/login.c
index bef1185..fb544fe 100644
--- a/utils/login.c
+++ b/utils/login.c
@@ -778,6 +778,9 @@ main(int argc, char *argv[])
 
       /* If we get here, we looked up the default shell ok.  */
       shell = strdup (backup);
+      if (!shell)
+	error (1, errno, "Failed to allocate memory for shell");
+
       error (0, 0, "Using SHELL=%s", shell);
       envz_add (&args, &args_len, "SHELL", shell);
       err = 0;			/* Don't emit random err msgs later!  */
diff --git a/utils/mount.c b/utils/mount.c
index 52e1000..72c4b9e 100644
--- a/utils/mount.c
+++ b/utils/mount.c
@@ -672,7 +672,11 @@ main (int argc, char **argv)
 	.mnt_freq = 0, .mnt_passno = 0
       };
       if (firmlink)
-        m.mnt_type = strdup ("firmlink");
+	{
+	  m.mnt_type = strdup ("firmlink");
+	  if (!m.mnt_type)
+	    error (2, errno, "Failed to allocate memory for m.mnt_type");
+	}
 
       err = fstab_add_mntent (fstab, &m, &fs);
       if (err)
@@ -691,7 +695,11 @@ main (int argc, char **argv)
 	.mnt_freq = 0, .mnt_passno = 0
       };
       if (firmlink)
-        m.mnt_type = strdup ("firmlink");
+	{
+	  m.mnt_type = strdup ("firmlink");
+	  if (!m.mnt_type)
+	    error (2, errno, "Failed to allocate memory for m.mnt_type");
+	}
 
       err = fstab_add_mntent (fstab, &m, &fs);
       if (err)
diff --git a/utils/msgids.c b/utils/msgids.c
index d50a736..af67008 100644
--- a/utils/msgids.c
+++ b/utils/msgids.c
@@ -96,36 +96,41 @@ const struct msgid_info *
 msgid_info (mach_msg_id_t msgid)
 {
   const struct msgid_info *info = hurd_ihash_find (&msgid_ihash, msgid);
-  if (info == 0 && (msgid / 100) % 2 == 1)
+  if (info || (msgid / 100) % 2 != 1)
+    return info;
+
+  /* This message ID is not in the table, and its number makes it
+     what should be an RPC reply message ID.  So look up the message
+     ID of the corresponding RPC request and synthesize a name from
+     that.  Then stash that name in the table so the next time the
+     lookup will match directly.  */
+  info = hurd_ihash_find (&msgid_ihash, msgid - 100);
+  if (!info)
+    return NULL;
+
+  struct msgid_info *reply_info = malloc (sizeof *info);
+  if (!reply_info)
+    return NULL;
+
+  /* asprintf and strdup may fail with ENOMEM, react the same way
+     to malloc failing.  */
+  reply_info->subsystem = strdup (info->subsystem);
+  if (!reply_info->subsystem)
     {
-      /* This message ID is not in the table, and its number makes it
-	 what should be an RPC reply message ID.  So look up the message
-	 ID of the corresponding RPC request and synthesize a name from
-	 that.  Then stash that name in the table so the next time the
-	 lookup will match directly.  */
-      info = hurd_ihash_find (&msgid_ihash, msgid - 100);
-      if (info != 0)
-	{
-	  struct msgid_info *reply_info = malloc (sizeof *info);
-	  if (reply_info != 0)
-	    {
-	      int err;
-	      reply_info->subsystem = strdup (info->subsystem);
-	      reply_info->name = 0;
-	      err = asprintf (&reply_info->name, "%s-reply", info->name);
-	      if (err == -1)
-		/* asprintf may fail with ENOMEM, react the same way to malloc failing */
-		info = 0;
-	      else
-		{
-		  hurd_ihash_add (&msgid_ihash, msgid, reply_info);
-		  info = reply_info;
-		}
-	    }
-	  else
-	    info = 0;
-	}
+      free (reply_info);
+      return NULL;
     }
+
+  error_t err = asprintf (&reply_info->name, "%s-reply", info->name);
+  if (err == -1)
+    {
+      free (reply_info->subsystem);
+      free (reply_info);
+      return NULL;
+    }
+
+  hurd_ihash_add (&msgid_ihash, msgid, reply_info);
+  info = reply_info;
   return info;
 }
 
diff --git a/utils/w.c b/utils/w.c
index d6977c4..1713903 100644
--- a/utils/w.c
+++ b/utils/w.c
@@ -122,11 +122,18 @@ w_fetch (struct proc_stat *ps, ps_flags_t need, ps_flags_t have)
 	  ut_host[sizeof utmp->ut_host] = '\0';
 
 	  if (raw_hosts)
-	    hook->host = strdup (ut_host);
+	    {
+	      hook->host = strdup (ut_host);
+	      if (!hook->host)
+		return 0;
+	    }
 	  else
 	    {
 	      char *sd;
 	      hook->host = strdup (canon_host (ut_host) ?: ut_host);
+	      if (!hook->host)
+		return 0;
+
 	      sd = shared_domain (hook->host, localhost ());
 	      if (sd)
 		*sd = '\0';
diff --git a/utils/x.c b/utils/x.c
index 1303544..d75dd51 100644
--- a/utils/x.c
+++ b/utils/x.c
@@ -153,8 +153,12 @@ void verify_passwd (const char *name, const char *password,
     return;			/* Already got this one.  */
 
   if (name)
-    asprintf (&prompt, "Password for %s%s:",
-	      is_group ? "group " : "", name);
+    {
+      error_t err = asprintf (&prompt, "Password for %s%s:",
+			      is_group ? "group " : "", name);
+      if (err == -1)
+	error (50, errno, "Failed to allocate memory for prompt");
+    }
   else
     prompt = "Password:";
 
-- 
2.43.0

Reply via email to