cifs: Use file_dentry()
authorGoldwyn Rodrigues <rgoldwyn@suse.com>
Mon, 18 Apr 2016 11:41:52 +0000 (06:41 -0500)
committerSteve French <smfrench@gmail.com>
Tue, 17 May 2016 19:09:33 +0000 (14:09 -0500)
CIFS may be used as lower layer of overlayfs and accessing f_path.dentry can
lead to a crash.

Fix by replacing direct access of file->f_path.dentry with the
file_dentry() accessor, which will always return a native object.

Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
Acked-by: Shirish Pargaonkar <shirishpargaonkar@gmail.com>
Signed-off-by: Steve French <smfrench@gmail.com>
fs/cifs/file.c
fs/cifs/readdir.c

index c03d0744648b6412a0f30222fee249784d6b4c6a..489ddc79710578bd993d792be8a90d2fe4fe68b6 100644 (file)
@@ -271,7 +271,7 @@ struct cifsFileInfo *
 cifs_new_fileinfo(struct cifs_fid *fid, struct file *file,
                  struct tcon_link *tlink, __u32 oplock)
 {
-       struct dentry *dentry = file->f_path.dentry;
+       struct dentry *dentry = file_dentry(file);
        struct inode *inode = d_inode(dentry);
        struct cifsInodeInfo *cinode = CIFS_I(inode);
        struct cifsFileInfo *cfile;
@@ -461,7 +461,7 @@ int cifs_open(struct inode *inode, struct file *file)
        tcon = tlink_tcon(tlink);
        server = tcon->ses->server;
 
-       full_path = build_path_from_dentry(file->f_path.dentry);
+       full_path = build_path_from_dentry(file_dentry(file));
        if (full_path == NULL) {
                rc = -ENOMEM;
                goto out;
index 867439c2100173aa706298f0c59a959dcdc6c78a..65cf85dcda09bd773886c8aa6a86d82af1a033b5 100644 (file)
@@ -303,7 +303,7 @@ initiate_cifs_search(const unsigned int xid, struct file *file)
        cifsFile->invalidHandle = true;
        cifsFile->srch_inf.endOfSearch = false;
 
-       full_path = build_path_from_dentry(file->f_path.dentry);
+       full_path = build_path_from_dentry(file_dentry(file));
        if (full_path == NULL) {
                rc = -ENOMEM;
                goto error_exit;
@@ -762,7 +762,7 @@ static int cifs_filldir(char *find_entry, struct file *file,
                 */
                fattr.cf_flags |= CIFS_FATTR_NEED_REVAL;
 
-       cifs_prime_dcache(file->f_path.dentry, &name, &fattr);
+       cifs_prime_dcache(file_dentry(file), &name, &fattr);
 
        ino = cifs_uniqueid_to_ino_t(fattr.cf_uniqueid);
        return !dir_emit(ctx, name.name, name.len, ino, fattr.cf_dtype);