From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from zeniv.linux.org.uk ([195.92.253.2]:60680 "EHLO ZenIV.linux.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750757AbcFPICh (ORCPT ); Thu, 16 Jun 2016 04:02:37 -0400 Date: Thu, 16 Jun 2016 09:02:29 +0100 From: Al Viro To: Willy Tarreau Cc: Linus Torvalds , Andy Lutomirski , Andy Lutomirski , Linux FS Devel , Stephen Rothwell , Andrew Morton , stable Subject: Re: [PATCH v2 1/2] fs: Improve and simplify copy_mount_options Message-ID: <20160616080229.GC14480@ZenIV.linux.org.uk> References: <20160615235047.GA14480@ZenIV.linux.org.uk> <20160616054525.GA6803@1wt.eu> <20160616065738.GA7154@1wt.eu> <20160616070821.GB14480@ZenIV.linux.org.uk> <20160616072557.GA7336@1wt.eu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160616072557.GA7336@1wt.eu> Sender: stable-owner@vger.kernel.org List-ID: 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.