forked from mirrors/linux
		
	cifs: make cifs_ioctl handle NULL filp->private_data correctly
Commit13cfb7334emade 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 commit50ae28f01and 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
					
				
					 1 changed files with 10 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -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