On 2018-10-10 18:14, Laurent Vivier wrote:

> +     /* create a new binfmt namespace
> +      * if we are not in the first user namespace
> +      * but the binfmt namespace is the first one
> +      */
> +     if (READ_ONCE(ns->binfmt_ns) == NULL) {
> +             struct binfmt_namespace *new_ns;
> +
> +             new_ns = kmalloc(sizeof(struct binfmt_namespace),
> +                              GFP_KERNEL);
> +             if (new_ns == NULL)
> +                     return -ENOMEM;
> +             INIT_LIST_HEAD(&new_ns->entries);
> +             new_ns->enabled = 1;
> +             rwlock_init(&new_ns->entries_lock);
> +             new_ns->bm_mnt = NULL;
> +             new_ns->entry_count = 0;
> +             /* ensure new_ns is completely initialized before sharing it */
> +             smp_wmb();
> +             WRITE_ONCE(ns->binfmt_ns, new_ns);
> +     }

If ns->binfmt_ns can really change under us (given you use READ_ONCE),
what prevents two instances of this code running at the same time, in
which case one of them would leak its new_ns instance? Also, there
doesn't seem to be any smp_rmb() buddy to that wmb(), I don't think
that's implied by READ_ONCE() in binfmt_ns().

Rasmus

Reply via email to