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
