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, | ||||
| }; | ||||
| 
 | ||||
| #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 proc_dir_entry *de) | ||||
| { | ||||
|  | @ -413,8 +426,15 @@ struct inode *proc_get_inode(struct super_block *sb, unsigned int ino, | |||
| 		if (de->proc_iops) | ||||
| 			inode->i_op = de->proc_iops; | ||||
| 		if (de->proc_fops) { | ||||
| 			if (S_ISREG(inode->i_mode)) | ||||
| 				inode->i_fop = &proc_reg_file_ops; | ||||
| 			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; | ||||
| 			} | ||||
| 			else | ||||
| 				inode->i_fop = de->proc_fops; | ||||
| 		} | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 David Miller
						David Miller