forked from mirrors/linux
		
	Fix procfs compat_ioctl regression
It is important to only provide the compat_ioctl method if the downstream de->proc_fops does too, otherwise this utterly confuses the logic in fs/compat_ioctl.c and we end up doing the wrong thing. Signed-off-by: David S. Miller <davem@davemloft.net> Acked-by: Alexey Dobriyan <adobriyan@sw.ru> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									040b3a2df2
								
							
						
					
					
						commit
						778f3dd5a1
					
				
					 1 changed files with 22 additions and 2 deletions
				
			
		|  | @ -386,6 +386,19 @@ static const struct file_operations proc_reg_file_ops = { | ||||||
| 	.release	= proc_reg_release, | 	.release	= proc_reg_release, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | #ifdef CONFIG_COMPAT | ||||||
|  | static const struct file_operations proc_reg_file_ops_no_compat = { | ||||||
|  | 	.llseek		= proc_reg_llseek, | ||||||
|  | 	.read		= proc_reg_read, | ||||||
|  | 	.write		= proc_reg_write, | ||||||
|  | 	.poll		= proc_reg_poll, | ||||||
|  | 	.unlocked_ioctl	= proc_reg_unlocked_ioctl, | ||||||
|  | 	.mmap		= proc_reg_mmap, | ||||||
|  | 	.open		= proc_reg_open, | ||||||
|  | 	.release	= proc_reg_release, | ||||||
|  | }; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| struct inode *proc_get_inode(struct super_block *sb, unsigned int ino, | struct inode *proc_get_inode(struct super_block *sb, unsigned int ino, | ||||||
| 				struct proc_dir_entry *de) | 				struct proc_dir_entry *de) | ||||||
| { | { | ||||||
|  | @ -413,8 +426,15 @@ struct inode *proc_get_inode(struct super_block *sb, unsigned int ino, | ||||||
| 		if (de->proc_iops) | 		if (de->proc_iops) | ||||||
| 			inode->i_op = de->proc_iops; | 			inode->i_op = de->proc_iops; | ||||||
| 		if (de->proc_fops) { | 		if (de->proc_fops) { | ||||||
| 			if (S_ISREG(inode->i_mode)) | 			if (S_ISREG(inode->i_mode)) { | ||||||
|  | #ifdef CONFIG_COMPAT | ||||||
|  | 				if (!de->proc_fops->compat_ioctl) | ||||||
|  | 					inode->i_fop = | ||||||
|  | 						&proc_reg_file_ops_no_compat; | ||||||
|  | 				else | ||||||
|  | #endif | ||||||
| 					inode->i_fop = &proc_reg_file_ops; | 					inode->i_fop = &proc_reg_file_ops; | ||||||
|  | 			} | ||||||
| 			else | 			else | ||||||
| 				inode->i_fop = de->proc_fops; | 				inode->i_fop = de->proc_fops; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 David Miller
						David Miller