On Wed, 11 Oct 2017 00:48:40 +0200
Daniel Borkmann <dan...@iogearbox.net> wrote:

> On 10/10/2017 02:47 PM, Jesper Dangaard Brouer wrote:
> [...]
> > +static struct bpf_map *cpu_map_alloc(union bpf_attr *attr)
> > +{
> > +   struct bpf_cpu_map *cmap;
> > +   int err = -ENOMEM;
> > +   u64 cost;
> > +   int ret;
> > +
> > +   if (!capable(CAP_SYS_ADMIN))
> > +           return ERR_PTR(-EPERM);
> > +
> > +   /* check sanity of attributes */
> > +   if (attr->max_entries == 0 || attr->key_size != 4 ||
> > +       attr->value_size != 4 || attr->map_flags & ~BPF_F_NUMA_NODE)
> > +           return ERR_PTR(-EINVAL);
> > +
> > +   cmap = kzalloc(sizeof(*cmap), GFP_USER);
> > +   if (!cmap)
> > +           return ERR_PTR(-ENOMEM);
> > +
> > +   /* mandatory map attributes */
> > +   cmap->map.map_type = attr->map_type;
> > +   cmap->map.key_size = attr->key_size;
> > +   cmap->map.value_size = attr->value_size;
> > +   cmap->map.max_entries = attr->max_entries;
> > +   cmap->map.map_flags = attr->map_flags;
> > +   cmap->map.numa_node = bpf_map_attr_numa_node(attr);
> > +
> > +   /* Pre-limit array size based on NR_CPUS, not final CPU check */
> > +   if (cmap->map.max_entries > NR_CPUS)
> > +           return ERR_PTR(-E2BIG);  
> 
> We still have a leak here, meaning kfree(cmap) is missing on above error.

Darn... yes, I introduced this in this V6 as I moved the check.

-- 
Best regards,
  Jesper Dangaard Brouer
  MSc.CS, Principal Kernel Engineer at Red Hat
  LinkedIn: http://www.linkedin.com/in/brouer

Reply via email to