[CIFS] Fix CIFS readdir access denied when SE Linux enabled
authorSteve French <sfrench@us.ibm.com>
Wed, 6 Sep 2006 22:02:22 +0000 (22:02 +0000)
committerSteve French <sfrench@us.ibm.com>
Wed, 6 Sep 2006 22:02:22 +0000 (22:02 +0000)
CIFS had one path in which dentry was instantiated before the corresponding
inode metadata was filled in.

Fixes Redhat bugzilla bug #163493

Signed-off-by: Steve French <sfrench@us.ibm.com>
Acked-by: Eric Paris <eparis@redhat.com>
Acked-by: Dave Kleikamp <shaggy@austin.ibm.com>
fs/cifs/readdir.c

index 105761e3ba0ea8277da8c95c5ccb28ca06446389..9aeb58a7d369380d3f81a5f63569c66405af2463 100644 (file)
@@ -82,7 +82,6 @@ static int construct_dentry(struct qstr *qstring, struct file *file,
                        if(*ptmp_inode == NULL)
                                return rc;
                        rc = 1;
-                       d_instantiate(tmp_dentry, *ptmp_inode);
                }
        } else {
                tmp_dentry = d_alloc(file->f_dentry, qstring);
@@ -99,9 +98,7 @@ static int construct_dentry(struct qstr *qstring, struct file *file,
                        tmp_dentry->d_op = &cifs_dentry_ops;
                if(*ptmp_inode == NULL)
                        return rc;
-               rc = 1;
-               d_instantiate(tmp_dentry, *ptmp_inode);
-               d_rehash(tmp_dentry);
+               rc = 2;
        }
 
        tmp_dentry->d_time = jiffies;
@@ -870,6 +867,12 @@ static int cifs_filldir(char *pfindEntry, struct file *file,
                                pfindEntry, &obj_type, rc);
        else
                fill_in_inode(tmp_inode, 1 /* NT */, pfindEntry, &obj_type, rc);
+
+       if(rc) /* new inode - needs to be tied to dentry */ {
+               d_instantiate(tmp_dentry, tmp_inode);
+               if(rc == 2)
+                       d_rehash(tmp_dentry);
+       }
        
        
        rc = filldir(direntry,qstring.name,qstring.len,file->f_pos,