Mikhail Karpov, le mer. 02 sept. 2026 08:47:42 +0700, a ecrit:
> Hello,
> 
> On Wed, 2 Sep 2026 01:15:30 Samuel Thibault wrote:
> 
> > > diff --git a/libps/procstat.c b/libps/procstat.c
> > > index 4de4216..a34da63 100644
> > > --- a/libps/procstat.c
> > > +++ b/libps/procstat.c
> > > @@ -204,6 +204,12 @@ 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)
> >
> > Move it just next to the malloc call.
> 
> I think in this case it would also be correct to move the ps->proc_info
> check
> after the malloc call.

Yes.
Applied, thanks!

Samuel


> From 8883e493b87fefa97feb9cedf500f448080c51aa Mon Sep 17 00:00:00 2001
> From: Mikhail Karpov <[email protected]>
> Date: Wed, 2 Sep 2026 08:20:44 +0700
> Subject: [PATCH] Added checks for alloc return value in several place
> 
> ---
>  defpager/backing.c                 |  5 ++++
>  defpager/defpager.c                | 23 ++++++++++++----
>  eth-multiplexer/netfs_impl.c       | 30 +++++++++++++++++---
>  ext2fs/dir.c                       | 41 ++++++++++++++++++++++------
>  fatfs/fat.c                        |  3 ++
>  fatfs/pager.c                      |  3 ++
>  libbpf/bpf_impl.c                  |  4 +++
>  libdiskfs/file-chg.c               | 11 +++++++-
>  libpager/lock-object.c             |  1 +
>  libpager/object-init.c             |  8 ++++++
>  libpager/pager-attr.c              |  1 +
>  libps/proclist.c                   |  6 +++-
>  libps/procstat.c                   | 10 +++++--
>  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                          |  7 ++++-
>  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                    | 16 ++++++++++-
>  startup/startup.c                  | 11 +++++++-
>  term/main.c                        |  3 ++
>  term/munge.c                       |  2 ++
>  term/users.c                       | 14 ++++++++++
>  trans/magic.c                      |  4 ++-
>  trans/new-fifo.c                   |  1 +
>  trans/remap.c                      |  3 ++
>  utils/msgport.c                    |  9 ++++++
>  utils/ps.c                         |  3 ++
>  utils/settrans.c                   |  6 ++--
>  38 files changed, 305 insertions(+), 32 deletions(-)
> 
> diff --git a/defpager/backing.c b/defpager/backing.c
> index 56fe655..d261dcc 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 errno;
> +
>    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 3b3cda1..02589a2 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 errno;
>  
> -      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,10 +68,16 @@ 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);
> +    {
> +      err = vm_allocate (mach_task_self (), buf, vm_page_size, 1);
> +      if (err)
> +     return err;
> +    }
>    else
>      {
>        store_read (backing_store, pager->map[pfn], vm_page_size, 
> @@ -89,7 +100,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 83a2313..2c8b18b 100644
> --- a/eth-multiplexer/netfs_impl.c
> +++ b/eth-multiplexer/netfs_impl.c
> @@ -65,13 +65,13 @@ new_node (struct lnode *ln, struct node **np)
>    struct node *node;
>  
>    if (nn == 0)
> -    return ENOMEM;
> +    return errno;
>    node = netfs_make_node (nn);
>    if (node == 0)
>      {
>        free (nn);
>        *np = NULL;
> -      return ENOMEM;
> +      return errno;
>      }
>    if (ln)
>      ln->n = node;
> @@ -86,17 +86,33 @@ lookup (const char *name)
>    struct lnode *ln = (struct lnode *) lookup_dev_by_name (name);
>  
>    char *copied_name = malloc (strlen (name) + 1);
> +  if (!copied_name)
> +    return NULL;
> +
>    strcpy (copied_name, name);
> +  error_t err;
>    if (ln)
>      {
> -      new_node (ln, &ln->n);
> +      err = new_node (ln, &ln->n);
> +      if (err)
> +     {
> +       errno = err;
> +       return NULL;
> +     }
> +
>        ln->n->nn->name = copied_name;
>        return ln->n;
>      }
>    else
>      {
>        struct node *n;
> -      new_node (ln, &n);
> +      err = new_node (ln, &n);
> +      if (err)
> +     {
> +       errno = err;
> +       return NULL;
> +     }
> +
>        n->nn->name = copied_name;
>        return n;
>      }
> @@ -305,6 +321,12 @@ error_t netfs_attempt_lookup (struct iouser *user, 
> struct node *dir,
>      }
>  
>    *node = lookup (name);
> +  if (!*node)
> +    {
> +      pthread_mutex_unlock (&dir->lock);
> +      return errno;
> +    }
> +
>    pthread_mutex_lock (&(*node)->lock);
>    pthread_mutex_unlock (&dir->lock);
>    return 0;
> diff --git a/ext2fs/dir.c b/ext2fs/dir.c
> index 55f2657..b905299 100644
> --- a/ext2fs/dir.c
> +++ b/ext2fs/dir.c
> @@ -493,6 +493,12 @@ 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)
> +         {
> +           ext2_warning ("Failed to allocate memory for dirents");
> +           return ENOENT;
> +         }
> +
>         for (i = 0; i < dp->dn_stat.st_size/DIRBLKSIZ; i++)
>           diskfs_node_disknode (dp)->dirents[i] = -1;
>       }
> @@ -687,23 +693,34 @@ 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)));
> -       for (i = oldsize / DIRBLKSIZ;
> -            i < dp->dn_stat.st_size / DIRBLKSIZ;
> -            i++)
> -         diskfs_node_disknode (dp)->dirents[i] = -1;
> +       if (!new_dirents)
> +         ext2_warning ("Failed to reallocate memory for new_dirents");
> +       else
> +         {
> +           diskfs_node_disknode (dp)->dirents = new_dirents;
> +           for (i = oldsize / DIRBLKSIZ;
> +                i < dp->dn_stat.st_size / DIRBLKSIZ;
> +                i++)
> +             diskfs_node_disknode (dp)->dirents[i] = -1;
>  
> -       diskfs_node_disknode (dp)->dirents[ds->idx] = 1;
> +           diskfs_node_disknode (dp)->dirents[ds->idx] = 1;
> +         }
>       }
>        else
>       {
>         diskfs_node_disknode (dp)->dirents =
>           malloc (dp->dn_stat.st_size / DIRBLKSIZ * sizeof (int));
> -       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;
> +       if (!diskfs_node_disknode (dp)->dirents)
> +         ext2_warning ("Failed to allocate memory for dirents");
> +       else
> +         {
> +           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 +924,12 @@ 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)
> +     {
> +       ext2_warning ("Failed to allocate memory for dirents");
> +       return ENOENT;
> +     }
> +
>        for (i = 0; i < nblks; i++)
>       diskfs_node_disknode (dp)->dirents[i] = -1;
>      }
> diff --git a/fatfs/fat.c b/fatfs/fat.c
> index e765376..b97cff3 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, errno, "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 e2302ce..88e014d 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, errno, "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 c78176c..38d71ab 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 18170c2..be62217 100644
> --- a/libdiskfs/file-chg.c
> +++ b/libdiskfs/file-chg.c
> @@ -37,13 +37,22 @@ diskfs_S_file_notice_changes (struct protid *cred, 
> mach_port_t notify)
>  
>    np = cred->po->np;
>    pthread_mutex_lock (&np->lock);
> +  req = malloc (sizeof (struct modreq));
> +  if (!req)
> +    {
> +      err = errno;
> +      pthread_mutex_unlock (&np->lock);
> +      return err;
> +    }
> +
>    err = file_changed (notify, np->filemod_tick, FILE_CHANGED_NULL, 0, 0);
>    if (err)
>      {
> +      free (req);
>        pthread_mutex_unlock (&np->lock);
>        return err;
>      }
> -  req = malloc (sizeof (struct modreq));
> +
>    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 d8a4c1f..01114ee 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 619d28f..9b7e8b0 100644
> --- a/libpager/object-init.c
> +++ b/libpager/object-init.c
> @@ -43,6 +43,14 @@ _pager_S_memory_object_init (struct pager *p,
>      {
>  #ifdef KERNEL_INIT_RACE
>        struct pending_init *i = malloc (sizeof (struct pending_init));
> +      if (!i)
> +     {
> +       error_t err = errno;
> +       printf ("failed to allocate memory for pending_init");
> +       pthread_mutex_unlock (&p->interlock);
> +       return err;
> +     }
> +
>        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 4280e26..66c9b61 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 e1ce4c1..f9d408a 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 errno;
> +     }
>  
>        for (i = 0; i < num_procs; i++)
>       {
> diff --git a/libps/procstat.c b/libps/procstat.c
> index 4de4216..7f12777 100644
> --- a/libps/procstat.c
> +++ b/libps/procstat.c
> @@ -188,10 +188,10 @@ merge_procinfo (struct proc_stat *ps, ps_flags_t need, 
> ps_flags_t have)
>         probably big enough for everything.  */
>      {
>        ps->proc_info = malloc (PROCINFO_MALLOC_SIZE);
> -      ps->proc_info_size = PROCINFO_MALLOC_SIZE;
> -      ps->proc_info_vm_alloced = 0;
>        if (! ps->proc_info)
>       return ENOMEM;
> +      ps->proc_info_size = PROCINFO_MALLOC_SIZE;
> +      ps->proc_info_vm_alloced = 0;
>      }
>    new_pi = ps->proc_info;
>    new_pi_size = ps->proc_info_size;
> @@ -202,6 +202,12 @@ merge_procinfo (struct proc_stat *ps, ps_flags_t need, 
> ps_flags_t have)
>        if (! (have & PSTAT_THREAD_WAITS))
>       {
>         ps->thread_waits = malloc (WAITS_MALLOC_SIZE);
> +       if (! ps->thread_waits)
> +         {
> +           if (! (have & PSTAT_PROCINFO))
> +             free (new_pi);
> +           return ENOMEM;
> +         }
>         ps->thread_waits_len = WAITS_MALLOC_SIZE;
>         ps->thread_waits_vm_alloced = 0;
>       }
> diff --git a/libstore/remap.c b/libstore/remap.c
> index bbe7850..18fc78e 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)
> +     return 0;
> +
> +      *xruns = new_xruns;
> +    }
>  
>    return 0;
>  }
> diff --git a/lwip/lwip-util.c b/lwip/lwip-util.c
> index 4a83b8f..5dee35d 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);
>  
> @@ -366,6 +370,9 @@ configure_device (struct netif *netif, ip4_addr_t addr, 
> ip4_addr_t netmask,
>      {
>        /* Call update_if() inside the tcpip_thread */
>        struct update_if_args *arg = calloc (1, sizeof (struct 
> update_if_args));
> +      if (!arg)
> +        return errno;
> +
>        arg->netif = netif;
>        arg->addr = addr;
>        arg->netmask = netmask;
> diff --git a/lwip/pfinet-ops.c b/lwip/pfinet-ops.c
> index 0755fcb..b9d2ef2 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;
> @@ -209,6 +212,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);
>  
> @@ -231,6 +236,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 cc4290a..3dac5d1 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 errno;
> +
>    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 55f5a60..b422f28 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 e55fa64..813a0a5 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 affdd93..c87ec72 100644
> --- a/nfs/ops.c
> +++ b/nfs/ops.c
> @@ -2086,10 +2086,15 @@ netfs_attempt_mksymlink (struct iouser *cred,
>    if (np->nn->dtrans == NOT_POSSIBLE)
>      return EOPNOTSUPP;
>  
> +  char *name = malloc (strlen (arg) + 1);
> +  if (!name)
> +    return errno;
> +
>    if (np->nn->dtrans == SYMLINK)
>      free (np->nn->transarg.name);
>  
> -  np->nn->transarg.name = malloc (strlen (arg) + 1);
> +  np->nn->transarg.name = name;
> +
>    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 864739c..f13a8ca 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 f746716..5a68543 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, errno, "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, errno, "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 8e3ab25..386a904 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 8b17559..c40dc1e 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 62ba2ff..e34c0a7 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 ff2e82b..5c587fa 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 dcb619a..05af823 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 5a60899..a11e278 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 errno;
>  
>    for (i=0; i < dcn->num_dirs; i++)
>      {
> @@ -53,8 +55,20 @@ 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)
> +         {
> +           err = errno;
> +           free (*contents);
> +           *contents = NULL;
> +           return err;
> +         }
> +
> +       *contents = new_contents;
> +     }
>  
>        memcpy (*contents + pos, subcon, sublen);
>        pos += sublen;
> diff --git a/startup/startup.c b/startup/startup.c
> index fe409f5..9771884 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 errno;
> +
>    nt->notify_port = notify;
>    nt->next = ntfy_tasks;
> -  ntfy_tasks = nt;
>    nt->name = malloc (strlen (name) + 1);
> +  if (!nt->name)
> +    {
> +      free (nt);
> +      return errno;
> +    }
> +
> +  ntfy_tasks = nt;
>    strcpy (nt->name, name);
>    return 0;
>  }
> diff --git a/term/main.c b/term/main.c
> index 99ce2c6..4c24ba7 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, 1, errno, "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 0903dd0..ca27ac1 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 629534f..2b6db3b 100644
> --- a/term/users.c
> +++ b/term/users.c
> @@ -445,6 +445,12 @@ S_term_open_ctty (struct trivfs_protid *cred,
>        if (!err)
>       {
>         struct protid_hook *hook = malloc (sizeof (struct protid_hook));
> +       if (!hook)
> +         {
> +           err = errno;
> +           ports_port_deref (newcred);
> +           return err;
> +         }
>  
>         hook->pid = pid;
>         hook->pgrp = pgrp;
> @@ -1938,7 +1944,15 @@ trivfs_S_io_async (struct trivfs_protid *cred,
>        pthread_mutex_unlock (&global_lock);
>        return EBADF;
>      }
> +
>    ar = malloc (sizeof (struct async_req));
> +  if (!ar)
> +    {
> +      error_t err = errno;
> +      pthread_mutex_unlock (&global_lock);
> +      return err;
> +    }
> +
>    ar->notify = notify;
>    ar->next = async_requests;
>    async_requests = ar;
> diff --git a/trans/magic.c b/trans/magic.c
> index 73fdaea..0ddbd78 100644
> --- a/trans/magic.c
> +++ b/trans/magic.c
> @@ -427,7 +427,8 @@ 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, 1, errno, "Failed to allocate memory for"
> +                                        " m->dirbuf");
>         m->dirbuf = buf;
>         struct dirent *d;
>         d = add (m->dirbuf, ".");
> @@ -462,6 +463,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 7880eb2..ee8f482 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 39d6ff9..c434a26 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, 1, errno, "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 e3ea430..602e09e 100644
> --- a/utils/msgport.c
> +++ b/utils/msgport.c
> @@ -558,6 +558,8 @@ add_cmd (cmd_func_t func, size_t minargs, size_t maxargs,
>  
>    *params->cmds = cmds;
>    *params->num_cmds = num_cmds;
> +  if (!cmds)
> +    argp_failure (state, 1, errno, "Failed to reallocate memory for cmds");
>  
>    cmd = &cmds[num_cmds-1];
>    cmd->f = func;
> @@ -565,6 +567,10 @@ add_cmd (cmd_func_t func, size_t minargs, size_t maxargs,
>    if (maxargs)
>      {
>        cmd->args = malloc (maxargs * sizeof (char *));
> +      if (!cmd->args)
> +     argp_failure (state, 1, errno, "Failed to allocate memory for"
> +                                    " cmd->args");
> +
>        if (arg)
>       cmd->args[i++] = arg;
>        while (i < maxargs
> @@ -596,6 +602,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, 1, errno, "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 6a08f73..9ddd59e 100644
> --- a/utils/ps.c
> +++ b/utils/ps.c
> @@ -276,6 +276,9 @@ main(int argc, char *argv[])
>           {
>             size_t len = strlen (arg) + 1;
>             arg_hack_buf = realloc (arg_hack_buf, 1 + len);
> +           if (!arg_hack_buf)
> +             argp_failure (state, 1, errno, "Failed to allocate memory for"
> +                                            " arg_hack_buf");
>             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 1622f70..70971c3 100644
> --- a/utils/settrans.c
> +++ b/utils/settrans.c
> @@ -109,7 +109,7 @@ get_credentials (void)
>  
>    uids = malloc (uids_len * sizeof (uid_t));
>    if (! uids)
> -    return ENOMEM;
> +    return errno;
>  
>    uids_len = geteuids (uids_len, uids);
>    if (uids_len < 0)
> @@ -121,8 +121,8 @@ get_credentials (void)
>      return errno;
>  
>    gids = malloc (gids_len * sizeof (gid_t));
> -  if (! uids)
> -    return ENOMEM;
> +  if (! gids)
> +    return errno;
>  
>    gids_len = getgroups (gids_len, gids);
>    if (gids_len < 0)
> -- 
> 2.43.0
> 


-- 
Samuel
Pour un père, autant mourir que de faire plein de calculs et pas s'occuper
de son fils
 -+- y sur #ens-mim - sombres histoires de zombies -+-

Reply via email to