Re: [PATCH v2 1/2] fs: Improve and simplify copy_mount_options

Al Viro
2016-06-16T08:02:37Z

On Thu, Jun 16, 2016 at 09:25:57AM +0200, Willy Tarreau wrote:
> On Thu, Jun 16, 2016 at 08:08:22AM +0100, Al Viro wrote:
> > On Thu, Jun 16, 2016 at 08:57:38AM +0200, Willy Tarreau wrote:
> > > + type = get_fs_type(fstype);
> > > + if (!type)
> > > + return NULL;
> > > +
> > > copy = kmalloc(PAGE_SIZE, GFP_KERNEL);
> > > if (!copy)
> > > return ERR_PTR(-ENOMEM);
> > >
> > > + /* avoid reading a whole page if the FS only needs a string. */
> > > + if (!(type->fs_flags & FS_BINARY_MOUNTDATA)) {
> > > + strlcpy(copy, data, PAGE_SIZE);
> > > + return copy;
> >
> > a) it leaks a file_system_type reference
>
> I was not sure about this one, thanks for confirming.
>
> > b) data is a userland pointer, for crying out loud!
>
> Yep I noticed it and fixed it after sending. I was focused on the
> data coming from kernel due to the discussion.
>
> I also think that since there are only two call places for
> copy_mount_options(), we may move the test there and switch
> to copy_mount_string() instead depending on the fs type.

Another problem is that it will oops with NULL fstype, which is
absolutely normal both for mount --bind *and* mount -o remount.
And while mount --bind doesn't care about string options,
mount -o remount certainly does. IMO the latter makes that
approach hopeless - with remount you don't know the type
until well into do_mount() guts and I'd really hate to carry
the userland pointer all the way into it.