Added checks for alloc return value in several place.
Mikhail Karpov <[email protected]> Wed, 1 Jul 2026 21:01:17 +0700
| Newsgroups | gmane.os.hurd.bugs |
|---|---|
| Message-ID | <[email protected]> |
Hello! Similar to mmap, I checked the code where malloc, calloc, and realloc were called. In these places, variable values weren't checked for NULL before being accessed. Thanks, -- Mikhail Karpov
0001-Added-checks-for-alloc-return-value-in-several-place.patch
(text/x-patch, 33 KB)
From 501c2b093846ff22890d96e8d79db7d718d4976b Mon Sep 17 00:00:00 2001 From: Mikhail Karpov <[email protected]> Date: Wed, 1 Jul 2026 20:40:59 +0700 Subject: [PATCH] Added checks for alloc return value in several places. --- defpager/backing.c | 5 ++++ defpager/defpager.c | 17 +++++++++--- eth-multiplexer/netfs_impl.c | 22 +++++++++++---- ext2fs/dir.c | 15 +++++++++- fatfs/fat.c | 3 ++ fatfs/pager.c | 3 ++ libbpf/bpf_impl.c | 4 +++ libdiskfs/file-chg.c | 7 +++++ libpager/lock-object.c | 1 + libpager/object-init.c | 7 +++++ libpager/pager-attr.c | 1 + libps/proclist.c | 6 +++- libps/procstat.c | 5 ++++ libstore/remap.c | 9 +++++- lwip/lwip-util.c | 9 +++++- lwip/pfinet-ops.c | 8 ++++++ lwip/port/netif/ifcommon.c | 3 ++ lwip/socket-ops.c | 3 ++ mach-defpager/default_pager.c | 44 ++++++++++++++++++++++++++++++ nfs/ops.c | 3 ++ nfsd/cache.c | 6 ++++ nfsd/fsys.c | 18 +++++++++++- nfsd/loop.c | 3 ++ nfsd/xdr.c | 2 ++ pfinet/glue-include/linux/kernel.h | 3 ++ pfinet/socket-ops.c | 3 ++ proc/mgt.c | 1 + procfs/dircat.c | 15 +++++++++- startup/startup.c | 9 ++++++ term/main.c | 3 ++ term/munge.c | 2 ++ term/users.c | 9 ++++++ trans/magic.c | 3 +- trans/new-fifo.c | 1 + trans/remap.c | 3 ++ utils/msgport.c | 8 ++++++ utils/ps.c | 2 ++ utils/settrans.c | 2 +- 38 files changed, 251 insertions(+), 17 deletions(-) diff --git a/defpager/backing.c b/defpager/backing.c index 56fe6551..14511004 100644 --- a/defpager/backing.c +++ b/defpager/backing.c @@ -50,6 +50,9 @@ init_backing (char *name) bmap_len = backing_store->size / vm_page_size / NBBY; bmap = malloc (bmap_len); + if (!bmap) + return ENOMEM; + for (i = 0; i < bmap_len; i++) bmap[i] = 0xff; bmap_rotor = bmap; @@ -60,6 +63,8 @@ init_backing (char *name) sure we don't tromp on the misfeature in Linux of using the first page for permanent data. */ *bmap_rotor |= 1; + + return 0; } int diff --git a/defpager/defpager.c b/defpager/defpager.c index 3b3cda1e..5f42fd98 100644 --- a/defpager/defpager.c +++ b/defpager/defpager.c @@ -33,7 +33,7 @@ struct user_pager_info /* Expand the P->map as necessary to handle an incoming request of the page at ADDR. */ -static inline void +static inline error_t expand_map (struct user_pager_info *p, vm_offset_t addr) { /* See if this is beyond the current extent */ @@ -44,11 +44,16 @@ expand_map (struct user_pager_info *p, vm_offset_t addr) newsize = page + vm_page_size; newmap = realloc (pager->map, size / vm_page_size * sizeof (off_t)); + if (!newmap) + return ENOMEM; - memset (pager->map + pager->size / vm_page_size * sizeof(off_t), 0, (newsize - pager->size) / vm_page_size * sizeof(off_t)); + memset (pager->map + pager->size / vm_page_size * sizeof(off_t), + 0, (newsize - pager->size) / vm_page_size * sizeof(off_t)); pager->size = newsize; pager->map = newmap; } + + return 0; } error_t @@ -63,7 +68,9 @@ pager_read_page (struct user_pager_info *pager, /* We never request write locks. */ *write_lock = 0; - expand_map (pager, page); + error_t err = expand_map (pager, page); + if (err) + return err; if (!pager->map[pfn]) vm_allocate (mach_task_self (), buf, vm_page_size, 1); @@ -89,7 +96,9 @@ pager_write_page (struct user_pager_info *pager, int pfn = page / vm_page_size; size_t nwritten; - expand_map (pager, page); + error_t err = expand_map (pager, page); + if (err) + return err; if (!pager->map[pfn]) pager->map[pfn] = allocate_backing_page (); diff --git a/eth-multiplexer/netfs_impl.c b/eth-multiplexer/netfs_impl.c index 83a23132..1350616d 100644 --- a/eth-multiplexer/netfs_impl.c +++ b/eth-multiplexer/netfs_impl.c @@ -80,26 +80,31 @@ new_node (struct lnode *ln, struct node **np) return err; } -struct node * -lookup (const char *name) +static error_t +lookup (struct node **node, const char *name) { struct lnode *ln = (struct lnode *) lookup_dev_by_name (name); char *copied_name = malloc (strlen (name) + 1); + if (!copied_name) + return ENOMEM; + strcpy (copied_name, name); if (ln) { new_node (ln, &ln->n); ln->n->nn->name = copied_name; - return ln->n; + *node = ln->n; } else { struct node *n; new_node (ln, &n); n->nn->name = copied_name; - return n; + *node = n; } + + return 0; } /* Attempt to create a file named NAME in DIR for USER with MODE. Set *NODE @@ -304,7 +309,14 @@ error_t netfs_attempt_lookup (struct iouser *user, struct node *dir, return err; } - *node = lookup (name); + err = lookup (node, name); + if (err) + { + *node = NULL; + pthread_mutex_unlock (&dir->lock); + return err; + } + pthread_mutex_lock (&(*node)->lock); pthread_mutex_unlock (&dir->lock); return 0; diff --git a/ext2fs/dir.c b/ext2fs/dir.c index 55f26579..051540cf 100644 --- a/ext2fs/dir.c +++ b/ext2fs/dir.c @@ -493,6 +493,9 @@ dirscanblock (vm_address_t blockaddr, struct node *dp, int idx, { diskfs_node_disknode (dp)->dirents = malloc ((dp->dn_stat.st_size / DIRBLKSIZ) * sizeof (int)); + if (!diskfs_node_disknode (dp)->dirents) + return ENOMEM; + for (i = 0; i < dp->dn_stat.st_size/DIRBLKSIZ; i++) diskfs_node_disknode (dp)->dirents[i] = -1; } @@ -687,9 +690,13 @@ diskfs_direnter_hard (struct node *dp, const char *name, struct node *np, anything at all. */ if (diskfs_node_disknode (dp)->dirents) { - diskfs_node_disknode (dp)->dirents = + int *new_dirents = realloc (diskfs_node_disknode (dp)->dirents, (dp->dn_stat.st_size / DIRBLKSIZ * sizeof (int))); + if (!new_dirents) + return ENOMEM; + + diskfs_node_disknode (dp)->dirents = new_dirents; for (i = oldsize / DIRBLKSIZ; i < dp->dn_stat.st_size / DIRBLKSIZ; i++) @@ -701,6 +708,9 @@ diskfs_direnter_hard (struct node *dp, const char *name, struct node *np, { diskfs_node_disknode (dp)->dirents = malloc (dp->dn_stat.st_size / DIRBLKSIZ * sizeof (int)); + if (!diskfs_node_disknode (dp)->dirents) + return ENOMEM; + for (i = 0; i < dp->dn_stat.st_size / DIRBLKSIZ; i++) diskfs_node_disknode (dp)->dirents[i] = -1; diskfs_node_disknode (dp)->dirents[ds->idx] = 1; @@ -907,6 +917,9 @@ diskfs_get_directs (struct node *dp, if (!diskfs_node_disknode (dp)->dirents) { diskfs_node_disknode (dp)->dirents = malloc (nblks * sizeof (int)); + if (!diskfs_node_disknode (dp)->dirents) + return ENOMEM; + for (i = 0; i < nblks; i++) diskfs_node_disknode (dp)->dirents[i] = -1; } diff --git a/fatfs/fat.c b/fatfs/fat.c index e765376d..4af321c6 100644 --- a/fatfs/fat.c +++ b/fatfs/fat.c @@ -72,6 +72,9 @@ fat_read_sblock (void) size_t read = sizeof(struct boot_sector); sblock = malloc (read); + if (!sblock) + error (1, ENOMEM, "Failed to allocate memory for superblock."); + err = store_read (store, 0, read, (void **) &sblock, &read); if (err) error (1, err, "Could not read superblock"); diff --git a/fatfs/pager.c b/fatfs/pager.c index e2302cec..c56f9f56 100644 --- a/fatfs/pager.c +++ b/fatfs/pager.c @@ -776,6 +776,9 @@ create_fat_pager (void) /* The disk pager. */ struct user_pager_info *upi = malloc (sizeof (struct user_pager_info)); + if (!upi) + error (2, ENOMEM, "Failed to allocate memory for user_pager_info."); + upi->type = FAT; disk_pager_bucket = ports_create_bucket (); diskfs_start_disk_pager (upi, disk_pager_bucket, MAY_CACHE, 0, diff --git a/libbpf/bpf_impl.c b/libbpf/bpf_impl.c index c78176c2..38d71aba 100644 --- a/libbpf/bpf_impl.c +++ b/libbpf/bpf_impl.c @@ -612,6 +612,8 @@ net_set_filter(if_filter_list_t *ifp, mach_port_t rcv_port, int priority, * a normal packet filter structure. */ my_infp = (net_rcv_port_t) calloc(1, sizeof(struct net_rcv_port)); + if (!my_infp) + return (D_NO_MEMORY); my_infp->rcv_port = rcv_port; is_new_infp = TRUE; } else { @@ -622,6 +624,8 @@ net_set_filter(if_filter_list_t *ifp, mach_port_t rcv_port, int priority, */ my_infp = 0; hash_entp = (net_hash_entry_t) calloc(1, sizeof(struct net_hash_entry)); + if (!hash_entp) + return (D_NO_MEMORY); is_new_infp = FALSE; } diff --git a/libdiskfs/file-chg.c b/libdiskfs/file-chg.c index 18170c25..40d1a4ed 100644 --- a/libdiskfs/file-chg.c +++ b/libdiskfs/file-chg.c @@ -43,7 +43,14 @@ diskfs_S_file_notice_changes (struct protid *cred, mach_port_t notify) pthread_mutex_unlock (&np->lock); return err; } + req = malloc (sizeof (struct modreq)); + if (!req) + { + pthread_mutex_unlock (&np->lock); + return ENOMEM; + } + req->port = notify; req->next = np->filemod_reqs; np->filemod_reqs = req; diff --git a/libpager/lock-object.c b/libpager/lock-object.c index d8a4c1f8..01114ee2 100644 --- a/libpager/lock-object.c +++ b/libpager/lock-object.c @@ -52,6 +52,7 @@ _pager_lock_object (struct pager *p, if (!lr) { lr = malloc (sizeof (struct lock_request)); + assert_backtrace (lr); lr->start = offset; lr->end = offset + size; lr->pending_writes = 0; diff --git a/libpager/object-init.c b/libpager/object-init.c index 619d28f3..87b55f46 100644 --- a/libpager/object-init.c +++ b/libpager/object-init.c @@ -43,6 +43,13 @@ _pager_S_memory_object_init (struct pager *p, { #ifdef KERNEL_INIT_RACE struct pending_init *i = malloc (sizeof (struct pending_init)); + if (!i) + { + printf ("failed to allocate memory for pending_init"); + pthread_mutex_unlock (&p->interlock); + return ENOMEM; + } + printf ("pager out-of-sequence init\n"); i->control = control; i->name = name; diff --git a/libpager/pager-attr.c b/libpager/pager-attr.c index 4280e26d..66c9b61f 100644 --- a/libpager/pager-attr.c +++ b/libpager/pager-attr.c @@ -65,6 +65,7 @@ pager_change_attributes (struct pager *p, if (!ar) { ar = malloc (sizeof (struct attribute_request)); + assert_backtrace (ar); ar->may_cache = may_cache; ar->copy_strategy = copy_strategy; ar->attrs_pending = 1; diff --git a/libps/proclist.c b/libps/proclist.c index e1ce4c16..bbbe03a5 100644 --- a/libps/proclist.c +++ b/libps/proclist.c @@ -124,7 +124,11 @@ proc_stat_list_add_pids (struct proc_stat_list *pp, struct proc_stat **end = pp->proc_stats + pp->num_procs; if (proc_stats) - *proc_stats = NEWVEC (struct proc_stat *, num_procs); + { + *proc_stats = NEWVEC (struct proc_stat *, num_procs); + if (!*proc_stats) + return ENOMEM; + } for (i = 0; i < num_procs; i++) { diff --git a/libps/procstat.c b/libps/procstat.c index 4de4216d..ae01b2f4 100644 --- a/libps/procstat.c +++ b/libps/procstat.c @@ -204,6 +204,11 @@ merge_procinfo (struct proc_stat *ps, ps_flags_t need, ps_flags_t have) ps->thread_waits = malloc (WAITS_MALLOC_SIZE); ps->thread_waits_len = WAITS_MALLOC_SIZE; ps->thread_waits_vm_alloced = 0; + if (! ps->thread_waits) + { + free (new_pi); + return ENOMEM; + } } new_waits = ps->thread_waits; new_waits_len = ps->thread_waits_len; diff --git a/libstore/remap.c b/libstore/remap.c index bbe78509..82fae2fd 100644 --- a/libstore/remap.c +++ b/libstore/remap.c @@ -317,7 +317,14 @@ store_remap_runs (const struct store_run *runs, size_t num_runs, } if (xruns_alloced > *num_xruns) - *xruns = realloc (*xruns, *num_xruns * sizeof (struct store_run)); + { + void *new_xruns = realloc (*xruns, *num_xruns + * sizeof (struct store_run)); + if (!new_xruns) + ERR (ENOMEM); + + xruns = new_xruns; + } return 0; } diff --git a/lwip/lwip-util.c b/lwip/lwip-util.c index c265ad6a..304e3648 100644 --- a/lwip/lwip-util.c +++ b/lwip/lwip-util.c @@ -150,7 +150,10 @@ init_ifs (void *arg) int i; if (netif_list == 0) - netif_list = calloc (1, sizeof (struct netif)); + { + netif_list = calloc (1, sizeof (struct netif)); + assert_backtrace (netif_list); + } if (netif_list->next == 0) init_loopback (); @@ -186,6 +189,7 @@ init_ifs (void *arg) continue; netif = calloc (1, sizeof (struct netif)); + assert_backtrace (netif); create_netif_state (in->dev_name, &ifc); @@ -373,6 +377,9 @@ configure_device (struct netif *netif, uint32_t addr, uint32_t netmask, { /* Call update_if() inside the tcpip_thread */ struct update_if_args *arg = calloc (1, sizeof (struct update_if_args)); + if (!arg) + return ENOMEM; + arg->netif = netif; arg->addr = addr; arg->netmask = netmask; diff --git a/lwip/pfinet-ops.c b/lwip/pfinet-ops.c index e87cfe0d..e83122fe 100644 --- a/lwip/pfinet-ops.c +++ b/lwip/pfinet-ops.c @@ -106,6 +106,9 @@ lwip_S_pfinet_siocgifconf (io_t port, void *buf = mmap (0, amount, PROT_READ | PROT_WRITE, MAP_ANON, 0, 0); if (buf == MAP_FAILED) + /* Should check whether errno is indeed ENOMEM -- + but this can't be done in a straightforward way, + because the glue headers #undef errno. */ return ENOMEM; ifc.ifc_buf = buf; @@ -206,6 +209,8 @@ lwip_S_pfinet_getroutes (io_t port, *dealloc_data = FALSE; rtable = calloc (MAX_ROUTES, sizeof (ifrtreq_t)); + if (!rtable) + return ENOMEM; available_count = get_routes (rtable); @@ -228,6 +233,9 @@ lwip_S_pfinet_getroutes (io_t port, if (*routes == MAP_FAILED) { + /* Should check whether errno is indeed ENOMEM -- + but this can't be done in a straightforward way, + because the glue headers #undef errno. */ *len = 0; return ENOMEM; } diff --git a/lwip/port/netif/ifcommon.c b/lwip/port/netif/ifcommon.c index cc4290a0..a86c4edf 100644 --- a/lwip/port/netif/ifcommon.c +++ b/lwip/port/netif/ifcommon.c @@ -156,6 +156,9 @@ if_change_flags (struct netif * netif, uint16_t flags) */ struct if_change_flags_args *args = calloc (1, sizeof (struct if_change_flags_args)); + if (!args) + return ENOMEM; + args->netif = netif; args->flags = flags; err = tcpip_callback_wait(_if_change_flags, args); diff --git a/lwip/socket-ops.c b/lwip/socket-ops.c index 55f5a606..b422f289 100644 --- a/lwip/socket-ops.c +++ b/lwip/socket-ops.c @@ -291,6 +291,9 @@ lwip_S_socket_whatis_address (struct sock_addr * addr, void *buf = mmap (0, addr->address.sa.sa_len, PROT_READ | PROT_WRITE, MAP_ANON, 0, 0); if (buf == MAP_FAILED) + /* Should check whether errno is indeed ENOMEM -- + but this can't be done in a straightforward way, + because the glue headers #undef errno. */ return ENOMEM; *data = buf; diff --git a/mach-defpager/default_pager.c b/mach-defpager/default_pager.c index e55fa642..813a0a53 100644 --- a/mach-defpager/default_pager.c +++ b/mach-defpager/default_pager.c @@ -188,13 +188,20 @@ new_partition (const char *name, struct file_direct *fdp, bmsize = howmany(size, NB_BM) * sizeof(bm_entry_t); part = (partition_t) malloc(sizeof(struct part)); + if (!part) + panic("(default pager): failed to allocate memory for part"); pthread_mutex_init(&part->p_lock, NULL); part->name = (char*) malloc(n + 1); + if (!part->name) + panic("(default pager): failed to allocate memory for part->name"); strcpy(part->name, name); part->total_size = size; part->free = size; part->id = id; part->bitmap = (bm_entry_t *)malloc(bmsize); + if (!part->bitmap) + panic("(default pager): " + "failed to allocate memory for part->bitmap"); part->going_away= FALSE; part->file = fdp; @@ -633,6 +640,8 @@ dp_map_t pager_get_direct_map(dpager_t pager) } mapptr = (dp_map_t) malloc(alloc_size); + if (!mapptr) + panic("(default pager): failed to allocate memory for mapptr"); for (emapptr = &mapptr[(alloc_size-1) / sizeof(vm_offset_t)]; emapptr >= mapptr; emapptr--) @@ -683,10 +692,16 @@ pager_alloc(dpager_t pager, if (INDIRECT_PAGEMAP(size)) { mapptr = (vm_offset_t *) malloc(INDIRECT_PAGEMAP_SIZE(size)); + if (!mapptr) + panic("(default pager): " + "failed to allocate memory for mapptr"); for (i = INDIRECT_PAGEMAP_ENTRIES(size); --i >= 0;) mapptr[i] = 0; } else { mapptr = (vm_offset_t *) malloc(PAGEMAP_SIZE(size)); + if (!mapptr) + panic("(default pager): " + "failed to allocate memory for mapptr"); for (i = 0; i < size; i++) mapptr[i] = NO_CHECKSUM; } @@ -828,6 +843,9 @@ pager_extend(dpager_t pager, */ new_mapptr = (dp_map_t) malloc(INDIRECT_PAGEMAP_SIZE(new_size)); + if (!new_mapptr) + panic("(default pager): " + "failed to allocate memory for new_mapptr"); old_mapptr = pager_get_direct_map(pager); for (i = 0; i < INDIRECT_PAGEMAP_ENTRIES(old_size); i++) new_mapptr[i] = old_mapptr[i]; @@ -839,6 +857,9 @@ pager_extend(dpager_t pager, #ifdef CHECKSUM new_mapptr = (vm_offset_t *) malloc(INDIRECT_PAGEMAP_SIZE(new_size)); + if (!new_mapptr) + panic("(default pager): " + "failed to allocate memory for new_mapptr"); old_mapptr = pager->checksum; for (i = 0; i < INDIRECT_PAGEMAP_ENTRIES(old_size); i++) new_mapptr[i] = old_mapptr[i]; @@ -873,6 +894,9 @@ pager_extend(dpager_t pager, * Allocate new second-level map first. */ new_mapptr = (dp_map_t) malloc(PAGEMAP_SIZE(PAGEMAP_ENTRIES)); + if (!new_mapptr) + panic("(default pager): " + "failed to allocate memory for new_mapptr"); old_mapptr = pager_get_direct_map(pager); for (i = 0; i < old_size; i++) new_mapptr[i] = old_mapptr[i]; @@ -894,6 +918,9 @@ pager_extend(dpager_t pager, */ new_mapptr = (dp_map_t) malloc(INDIRECT_PAGEMAP_SIZE(new_size)); + if (!new_mapptr) + panic("(default pager): " + "failed to allocate memory for new_mapptr"); new_mapptr[0].indirect = old_mapptr; for (i = 1; i < INDIRECT_PAGEMAP_ENTRIES(new_size); i++) new_mapptr[i].indirect = 0; @@ -904,6 +931,9 @@ pager_extend(dpager_t pager, * Allocate new second-level map first. */ new_mapptr = (vm_offset_t *)malloc(PAGEMAP_SIZE(PAGEMAP_ENTRIES)); + if (!new_mapptr) + panic("(default pager): " + "failed to allocate memory for new_mapptr"); old_mapptr = pager->checksum; for (i = 0; i < old_size; i++) new_mapptr[i] = old_mapptr[i]; @@ -917,6 +947,9 @@ pager_extend(dpager_t pager, */ new_mapptr = (vm_offset_t *) malloc(INDIRECT_PAGEMAP_SIZE(new_size)); + if (!new_mapptr) + panic("(default pager): " + "failed to allocate memory for new_mapptr"); new_mapptr[0] = (vm_offset_t) old_mapptr; for (i = 1; i < INDIRECT_PAGEMAP_ENTRIES(new_size); i++) new_mapptr[i] = 0; @@ -932,6 +965,9 @@ pager_extend(dpager_t pager, * Enlarging a direct block. */ new_mapptr = (dp_map_t) malloc(PAGEMAP_SIZE(new_size)); + if (!new_mapptr) + panic("(default pager): " + "failed to allocate memory for new_mapptr"); old_mapptr = pager_get_direct_map(pager); for (i = 0; i < old_size; i++) new_mapptr[i] = old_mapptr[i]; @@ -943,6 +979,9 @@ pager_extend(dpager_t pager, #ifdef CHECKSUM new_mapptr = (vm_offset_t *) malloc(PAGEMAP_SIZE(new_size)); + if (!new_mapptr) + panic("(default pager): " + "failed to allocate memory for new_mapptr"); old_mapptr = pager->checksum; for (i = 0; i < old_size; i++) new_mapptr[i] = old_mapptr[i]; @@ -1021,6 +1060,9 @@ pager_truncate(dpager_t pager, vm_size_t new_size) /* in pages */ { const dp_map_t old_mapptr = pager->map; pager->map = (dp_map_t) malloc (INDIRECT_PAGEMAP_SIZE(new_size)); + if (!pager->map) + panic("(default pager): " + "failed to allocate memory for pager->map"); memcpy (pager->map, old_mapptr, INDIRECT_PAGEMAP_SIZE(new_size)); free ((char *) old_mapptr); } @@ -1042,6 +1084,8 @@ pager_truncate(dpager_t pager, vm_size_t new_size) /* in pages */ /* Now reduce the size of the direct map itself. */ const dp_map_t old_mapptr = pager->map; pager->map = (dp_map_t) malloc (PAGEMAP_SIZE (new_size)); + if (!pager->map) + panic("(default pager): failed to allocate memory for pager->map"); memcpy (pager->map, old_mapptr, PAGEMAP_SIZE (new_size)); free ((char *) old_mapptr); } diff --git a/nfs/ops.c b/nfs/ops.c index affdd931..c5100354 100644 --- a/nfs/ops.c +++ b/nfs/ops.c @@ -2090,6 +2090,9 @@ netfs_attempt_mksymlink (struct iouser *cred, free (np->nn->transarg.name); np->nn->transarg.name = malloc (strlen (arg) + 1); + if (!np->nn->transarg.name) + return ENOMEM; + strcpy (np->nn->transarg.name, arg); np->nn->dtrans = SYMLINK; np->nn->stat_updated = 0; diff --git a/nfsd/cache.c b/nfsd/cache.c index 864739c0..f13a8ca5 100644 --- a/nfsd/cache.c +++ b/nfsd/cache.c @@ -106,10 +106,13 @@ idspec_lookup (int nuids, int ngids, int *uids, int *gids) assert_backtrace (sizeof (uid_t) == sizeof (int)); i = malloc (sizeof (struct idspec)); + assert_backtrace (i); i->nuids = nuids; i->ngids = ngids; i->uids = malloc (nuids * sizeof (uid_t)); i->gids = malloc (ngids * sizeof (gid_t)); + assert_backtrace (i->uids); + assert_backtrace (i->gids); memcpy (i->uids, uids, nuids * sizeof (uid_t)); memcpy (i->gids, gids, ngids * sizeof (gid_t)); i->references = 1; @@ -304,6 +307,7 @@ lookup_cache_handle (int *p, struct cache_handle **cp, struct idspec *i) } c = malloc (sizeof (struct cache_handle)); + assert_backtrace (c); memcpy (c->handle.array, p, NFS2_FHSIZE); cred_ref (i); c->ids = i; @@ -448,6 +452,7 @@ create_cached_handle (int fs, struct cache_handle *credc, file_t userport) /* Create it anew. */ c = malloc (sizeof (struct cache_handle)); + assert_backtrace (c); memcpy (c->handle.array, fhandle.array, NFS2_FHSIZE); cred_ref (credc->ids); c->ids = credc->ids; @@ -498,6 +503,7 @@ check_cached_replies (int xid, } cr = malloc (sizeof (struct cached_reply)); + assert_backtrace (cr); pthread_mutex_init (&cr->lock, NULL); pthread_mutex_lock (&cr->lock); memcpy (&cr->source, sender, sizeof (struct sockaddr_in)); diff --git a/nfsd/fsys.c b/nfsd/fsys.c index f7467165..def443e2 100644 --- a/nfsd/fsys.c +++ b/nfsd/fsys.c @@ -24,6 +24,7 @@ #include <hurd.h> #include <fcntl.h> #include <string.h> +#include <assert-backtrace.h> #include "nfsd.h" @@ -54,6 +55,12 @@ init_filesystems (void) fsystable = (struct fsys_spec *) malloc ((fsystablesize = 10) * sizeof (struct fsys_spec)); + if (!fsystable) + { + error (0, ENOMEM, "Failed to allocate memory for fsystable"); + return; + } + for (i = 0; i < fsystablesize; i++) { fsystable[i].fsys = MACH_PORT_NULL; @@ -96,8 +103,15 @@ init_filesystems (void) if (index >= fsystablesize) { - fsystable = (struct fsys_spec *) + void *new_fsystable = realloc (fsystable, index * 2 * sizeof (struct fsys_spec)); + if (!new_fsystable) + { + error (0, ENOMEM, "Cannot reallocate memory for fsystable"); + return; + } + + fsystable = new_fsystable; for (i = fsystablesize; i < index * 2; i++) { fsystable[i].fsys = MACH_PORT_NULL; @@ -190,6 +204,7 @@ enter_filesystem (char *name, file_t root) fsystable = (struct fsys_spec *) realloc (fsystable, (fsystablesize * 2) * sizeof (struct fsys_spec)); + assert_backtrace (fsystable); for (i = fsystablesize; i < fsystablesize * 2; i++) { fsystable[i].fsys = MACH_PORT_NULL; @@ -199,6 +214,7 @@ enter_filesystem (char *name, file_t root) } fsystable[nfsys].name = malloc (strlen (name) + 1); + assert_backtrace (fsystable[nfsys].name); strcpy (fsystable[nfsys].name, name); file_getcontrol (root, &fsystable[nfsys].fsys); nfsys++; diff --git a/nfsd/loop.c b/nfsd/loop.c index 8e3ab251..386a9043 100644 --- a/nfsd/loop.c +++ b/nfsd/loop.c @@ -20,6 +20,7 @@ #include <string.h> #include <fcntl.h> +#include <assert-backtrace.h> #include "nfsd.h" @@ -81,6 +82,7 @@ server_loop (void *arg) goto repost_reply; r = (int *) (rbuf = malloc (MAXIOSIZE)); + assert_backtrace (r); if (ntohl (*p) != RPC_MSG_VERSION) { @@ -177,6 +179,7 @@ server_loop (void *arg) { free (rbuf); r = (int *) (rbuf = malloc (amt)); + assert_backtrace (r); } } diff --git a/nfsd/xdr.c b/nfsd/xdr.c index 8b175595..c40dc1ed 100644 --- a/nfsd/xdr.c +++ b/nfsd/xdr.c @@ -23,6 +23,7 @@ #include <sys/stat.h> #include <sys/statfs.h> #include <string.h> +#include <assert-backtrace.h> #include "nfsd.h" /* Any better ideas? */ @@ -96,6 +97,7 @@ decode_name (int *p, char **name) len = ntohl (*p); p++; *name = malloc (len + 1); + assert_backtrace (*name); memcpy (*name, p, len); (*name)[len] = '\0'; return p + INTSIZE (len); diff --git a/pfinet/glue-include/linux/kernel.h b/pfinet/glue-include/linux/kernel.h index 62ba2ff1..e34c0a77 100644 --- a/pfinet/glue-include/linux/kernel.h +++ b/pfinet/glue-include/linux/kernel.h @@ -46,6 +46,9 @@ static inline int getname (const char *name, char **newp) { *newp = malloc (strlen (name) + 1); + if (!*newp) + return ENOMEM; + strcpy (*newp, name); return 0; } diff --git a/pfinet/socket-ops.c b/pfinet/socket-ops.c index ff2e82bb..5c587faa 100644 --- a/pfinet/socket-ops.c +++ b/pfinet/socket-ops.c @@ -349,6 +349,9 @@ S_socket_whatis_address (struct sock_addr *addr, void *new_data = mmap (0, addr->address.sa_len, PROT_READ|PROT_WRITE, MAP_ANON, 0, 0); if (new_data == MAP_FAILED) + /* Should check whether errno is indeed ENOMEM -- + but this can't be done in a straightforward way, + because the glue headers #undef errno. */ return ENOMEM; *data = new_data; diff --git a/proc/mgt.c b/proc/mgt.c index dcb619af..05af823f 100644 --- a/proc/mgt.c +++ b/proc/mgt.c @@ -885,6 +885,7 @@ complete_proc (struct proc *p, pid_t pid) if (!nulllogin) { nulllogin = malloc (sizeof (struct login) + sizeof (nullsname) + 1); + assert_backtrace (nulllogin); nulllogin->l_refcnt = 1; strcpy (nulllogin->l_name, nullsname); } diff --git a/procfs/dircat.c b/procfs/dircat.c index 5a60899a..c257927c 100644 --- a/procfs/dircat.c +++ b/procfs/dircat.c @@ -36,6 +36,8 @@ dircat_get_contents (void *hook, char **contents, ssize_t *contents_len) pos = 0; *contents = malloc (sz = 512); + if (!*contents) + return ENOMEM; for (i=0; i < dcn->num_dirs; i++) { @@ -53,8 +55,19 @@ dircat_get_contents (void *hook, char **contents, ssize_t *contents_len) return err; } + char *new_contents; while (pos + sublen > sz) - *contents = realloc (*contents, sz *= 2); + { + new_contents = realloc (*contents, sz *= 2); + if (!new_contents) + { + free (*contents); + *contents = NULL; + return ENOMEM; + } + + *contents = new_contents; + } memcpy (*contents + pos, subcon, sublen); pos += sublen; diff --git a/startup/startup.c b/startup/startup.c index fe409f5c..8aa078af 100644 --- a/startup/startup.c +++ b/startup/startup.c @@ -1586,10 +1586,19 @@ S_startup_request_notification (mach_port_t server, calls; this is important. We need later notification requests to get executed first. */ nt = malloc (sizeof (struct ntfy_task)); + if (!nt) + return ENOMEM; + nt->notify_port = notify; nt->next = ntfy_tasks; ntfy_tasks = nt; nt->name = malloc (strlen (name) + 1); + if (!nt->name) + { + free (nt); + return ENOMEM; + } + strcpy (nt->name, name); return 0; } diff --git a/term/main.c b/term/main.c index 99ce2c66..9c1d807d 100644 --- a/term/main.c +++ b/term/main.c @@ -132,6 +132,9 @@ parse_opt (int opt, char *arg, struct argp_state *state) case ARGP_KEY_INIT: state->hook = calloc (1, sizeof *v); + if (!state->hook) + argp_failure (state, ENOMEM, 0, "Failed to allocate memory for" + " state->hook"); break; case ARGP_KEY_FINI: free (v); diff --git a/term/munge.c b/term/munge.c index 0903dd03..ca27ac15 100644 --- a/term/munge.c +++ b/term/munge.c @@ -752,6 +752,8 @@ reallocate_queue (struct queue *q) /* Make the queue twice as large. */ newq = malloc (sizeof (struct queue) + q->arraylen * 2 * sizeof (quoted_char)); + assert_backtrace (newq); + newq->susp = q->susp; newq->lowat = q->lowat; newq->hiwat = q->hiwat; diff --git a/term/users.c b/term/users.c index 629534ff..de8b4239 100644 --- a/term/users.c +++ b/term/users.c @@ -445,6 +445,8 @@ S_term_open_ctty (struct trivfs_protid *cred, if (!err) { struct protid_hook *hook = malloc (sizeof (struct protid_hook)); + if (!hook) + return ENOMEM; hook->pid = pid; hook->pgrp = pgrp; @@ -1938,7 +1940,14 @@ trivfs_S_io_async (struct trivfs_protid *cred, pthread_mutex_unlock (&global_lock); return EBADF; } + ar = malloc (sizeof (struct async_req)); + if (!ar) + { + pthread_mutex_unlock (&global_lock); + return ENOMEM; + } + ar->notify = notify; ar->next = async_requests; async_requests = ar; diff --git a/trans/magic.c b/trans/magic.c index 73fdaea3..d7e4146a 100644 --- a/trans/magic.c +++ b/trans/magic.c @@ -427,7 +427,7 @@ parse_opt (int opt, char *arg, struct argp_state *state) void *buf = mmap (0, getpagesize (), PROT_READ|PROT_WRITE, MAP_ANON, 0, 0); if (buf == MAP_FAILED) - return errno; + argp_failure (state, errno, 0, "Failed to allocate memory"); m->dirbuf = buf; struct dirent *d; d = add (m->dirbuf, "."); @@ -462,6 +462,7 @@ main (int argc, char **argv) mach_port_t bootstrap; struct trivfs_control *fsys; struct magic *m = calloc (1, sizeof *m); + assert_backtrace (m); argp_parse (&argp, argc, argv, 0, 0, m); diff --git a/trans/new-fifo.c b/trans/new-fifo.c index 7880eb24..ee8f4820 100644 --- a/trans/new-fifo.c +++ b/trans/new-fifo.c @@ -100,6 +100,7 @@ static void fifo_trans_create (struct fifo_trans *from, struct fifo_trans **trans) { struct fifo_trans *new = malloc (sizeof (struct fifo_trans)); + assert_backtrace (new); new->server = 0; pthread_mutex_init (&new->active_fifo_lock, NULL); diff --git a/trans/remap.c b/trans/remap.c index 39d6ff92..b91fe10b 100644 --- a/trans/remap.c +++ b/trans/remap.c @@ -124,6 +124,9 @@ parse_opt (int key, char *arg, struct argp_state *state) { /* Second of a pair */ struct remap *remap = malloc (sizeof (*remap)); + if (!remap) + argp_failure (state, ENOMEM, 0, "Failed to allocate memory for" + " remap"); remap->from = remap_from; remap->to = strdup (arg); remap->next = remaps; diff --git a/utils/msgport.c b/utils/msgport.c index e3ea4302..4b6df302 100644 --- a/utils/msgport.c +++ b/utils/msgport.c @@ -555,6 +555,8 @@ add_cmd (cmd_func_t func, size_t minargs, size_t maxargs, struct cmds_argp_params *params = state->input; size_t num_cmds = *params->num_cmds + 1; cmd_t *cmds = realloc (*params->cmds, num_cmds * sizeof(cmd_t)); + if (!cmds) + return ENOMEM; *params->cmds = cmds; *params->num_cmds = num_cmds; @@ -565,6 +567,9 @@ add_cmd (cmd_func_t func, size_t minargs, size_t maxargs, if (maxargs) { cmd->args = malloc (maxargs * sizeof (char *)); + if (!cmd->args) + return ENOMEM; + if (arg) cmd->args[i++] = arg; while (i < maxargs @@ -596,6 +601,9 @@ parse_cmd_opt (int key, char *arg, struct argp_state *state) re-parse it with 2 dashes prepended. */ size_t len = strlen (arg) + 1; arg_hack_buf = realloc (arg_hack_buf, 2 + len); + if (!arg_hack_buf) + argp_failure (state, ENOMEM, 0, "Failed to reallocate memory for" + " arg_hack_buf"); state->argv[--state->next] = arg_hack_buf; state->argv[state->next][0] = '-'; state->argv[state->next][1] = '-'; diff --git a/utils/ps.c b/utils/ps.c index 6a08f736..14dac8db 100644 --- a/utils/ps.c +++ b/utils/ps.c @@ -276,6 +276,8 @@ main(int argc, char *argv[]) { size_t len = strlen (arg) + 1; arg_hack_buf = realloc (arg_hack_buf, 1 + len); + if (!arg_hack_buf) + return ENOMEM; state->argv[--state->next] = arg_hack_buf; state->argv[state->next][0] = '-'; memcpy (&state->argv[state->next][1], arg, len); diff --git a/utils/settrans.c b/utils/settrans.c index 1622f708..1407504d 100644 --- a/utils/settrans.c +++ b/utils/settrans.c @@ -121,7 +121,7 @@ get_credentials (void) return errno; gids = malloc (gids_len * sizeof (gid_t)); - if (! uids) + if (! gids) return ENOMEM; gids_len = getgroups (gids_len, gids); -- 2.43.0