Message ID | 1495829844-69341-2-git-send-email-keescook@chromium.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, May 26, 2017 at 01:17:05PM -0700, Kees Cook wrote: > When the call to nfs_devname() fails, the error path attempts to retain > the error via the mnt variable, but this requires a cast across very > different types (char * to struct vfsmount *), which the upcoming > structure layout randomization plugin flags as being potentially > dangerous in the face of randomization. This is a false positive, but > what this code actually wants to do is retain the error value, so this > patch explicitly sets it, instead of using what seems to be an > unexpected cast. > > Signed-off-by: Kees Cook <keescook@chromium.org> > Acked-by: Trond Myklebust <trond.myklebust@primarydata.com> Looks good: Reviewed-by: Christoph Hellwig <hch@lst.de> And I think we should get this (and the other cast patches) in ASAP, independent of the fat of the randstruct plugin.
On Sun, May 28, 2017 at 12:53 AM, Christoph Hellwig <hch@infradead.org> wrote: > On Fri, May 26, 2017 at 01:17:05PM -0700, Kees Cook wrote: >> When the call to nfs_devname() fails, the error path attempts to retain >> the error via the mnt variable, but this requires a cast across very >> different types (char * to struct vfsmount *), which the upcoming >> structure layout randomization plugin flags as being potentially >> dangerous in the face of randomization. This is a false positive, but >> what this code actually wants to do is retain the error value, so this >> patch explicitly sets it, instead of using what seems to be an >> unexpected cast. >> >> Signed-off-by: Kees Cook <keescook@chromium.org> >> Acked-by: Trond Myklebust <trond.myklebust@primarydata.com> > > Looks good: > > Reviewed-by: Christoph Hellwig <hch@lst.de> > > And I think we should get this (and the other cast patches) in ASAP, > independent of the fat of the randstruct plugin. Should I send a pull request to Linus for these for v4.12? -Kees
diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c index 1a224a33a6c2..e5686be67be8 100644 --- a/fs/nfs/namespace.c +++ b/fs/nfs/namespace.c @@ -246,7 +246,7 @@ struct vfsmount *nfs_do_submount(struct dentry *dentry, struct nfs_fh *fh, devname = nfs_devname(dentry, page, PAGE_SIZE); if (IS_ERR(devname)) - mnt = (struct vfsmount *)devname; + mnt = ERR_CAST(devname); else mnt = nfs_do_clone_mount(NFS_SB(dentry->d_sb), devname, &mountdata);