cifs: make cifs_ioctl handle NULL filp->private_data correctly
Commit13cfb7334e
made cifs_ioctl use the tlink attached to the cifsFileInfo for a filp. This ignores the case of an open directory however, which in CIFS can have a NULL private_data until a readdir is done on it. This patch re-adds the NULL pointer checks that were removed in commit50ae28f01
and moves the setting of tcon and "caps" variables lower. Long term, a better fix would be to establish a f_op->open routine for directories that populates that field at open time, but that requires some other changes to how readdir calls are handled. Reported-by: Kjell Rune Skaaraas <kjella79@yahoo.no> Reviewed-and-Tested-by: Suresh Jayaraman <sjayaraman@suse.de> Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Steve French <sfrench@us.ibm.com>
This commit is contained in:
parent
151f52f09c
commit
618763958b
|
@ -38,10 +38,10 @@ long cifs_ioctl(struct file *filep, unsigned int command, unsigned long arg)
|
|||
struct cifs_sb_info *cifs_sb;
|
||||
#ifdef CONFIG_CIFS_POSIX
|
||||
struct cifsFileInfo *pSMBFile = filep->private_data;
|
||||
struct cifsTconInfo *tcon = tlink_tcon(pSMBFile->tlink);
|
||||
struct cifsTconInfo *tcon;
|
||||
__u64 ExtAttrBits = 0;
|
||||
__u64 ExtAttrMask = 0;
|
||||
__u64 caps = le64_to_cpu(tcon->fsUnixInfo.Capability);
|
||||
__u64 caps;
|
||||
#endif /* CONFIG_CIFS_POSIX */
|
||||
|
||||
xid = GetXid();
|
||||
|
@ -62,6 +62,10 @@ long cifs_ioctl(struct file *filep, unsigned int command, unsigned long arg)
|
|||
break;
|
||||
#ifdef CONFIG_CIFS_POSIX
|
||||
case FS_IOC_GETFLAGS:
|
||||
if (pSMBFile == NULL)
|
||||
break;
|
||||
tcon = tlink_tcon(pSMBFile->tlink);
|
||||
caps = le64_to_cpu(tcon->fsUnixInfo.Capability);
|
||||
if (CIFS_UNIX_EXTATTR_CAP & caps) {
|
||||
rc = CIFSGetExtAttr(xid, tcon, pSMBFile->netfid,
|
||||
&ExtAttrBits, &ExtAttrMask);
|
||||
|
@ -73,6 +77,10 @@ long cifs_ioctl(struct file *filep, unsigned int command, unsigned long arg)
|
|||
break;
|
||||
|
||||
case FS_IOC_SETFLAGS:
|
||||
if (pSMBFile == NULL)
|
||||
break;
|
||||
tcon = tlink_tcon(pSMBFile->tlink);
|
||||
caps = le64_to_cpu(tcon->fsUnixInfo.Capability);
|
||||
if (CIFS_UNIX_EXTATTR_CAP & caps) {
|
||||
if (get_user(ExtAttrBits, (int __user *)arg)) {
|
||||
rc = -EFAULT;
|
||||
|
|
Loading…
Reference in a new issue