mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	locks: consolidate checks for compatible filp->f_mode values in setlk handlers
Move this check into flock64_to_posix_lock instead of duplicating it in two places. This also fixes a minor wart in the code where we continue referring to the struct flock after converting it to struct file_lock. Acked-by: J. Bruce Fields <bfields@fieldses.org> Signed-off-by: Jeff Layton <jlayton@redhat.com>
This commit is contained in:
		
							parent
							
								
									ef12e72a01
								
							
						
					
					
						commit
						bce7560d49
					
				
					 1 changed files with 12 additions and 34 deletions
				
			
		
							
								
								
									
										46
									
								
								fs/locks.c
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								fs/locks.c
									
									
									
									
									
								
							| 
						 | 
					@ -388,6 +388,18 @@ static int flock64_to_posix_lock(struct file *filp, struct file_lock *fl,
 | 
				
			||||||
	fl->fl_ops = NULL;
 | 
						fl->fl_ops = NULL;
 | 
				
			||||||
	fl->fl_lmops = NULL;
 | 
						fl->fl_lmops = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Ensure that fl->fl_filp has compatible f_mode */
 | 
				
			||||||
 | 
						switch (l->l_type) {
 | 
				
			||||||
 | 
						case F_RDLCK:
 | 
				
			||||||
 | 
							if (!(filp->f_mode & FMODE_READ))
 | 
				
			||||||
 | 
								return -EBADF;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case F_WRLCK:
 | 
				
			||||||
 | 
							if (!(filp->f_mode & FMODE_WRITE))
 | 
				
			||||||
 | 
								return -EBADF;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return assign_type(fl, l->l_type);
 | 
						return assign_type(fl, l->l_type);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2025,23 +2037,6 @@ int fcntl_setlk(unsigned int fd, struct file *filp, unsigned int cmd,
 | 
				
			||||||
		file_lock->fl_flags |= FL_SLEEP;
 | 
							file_lock->fl_flags |= FL_SLEEP;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	error = -EBADF;
 | 
					 | 
				
			||||||
	switch (flock.l_type) {
 | 
					 | 
				
			||||||
	case F_RDLCK:
 | 
					 | 
				
			||||||
		if (!(filp->f_mode & FMODE_READ))
 | 
					 | 
				
			||||||
			goto out;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case F_WRLCK:
 | 
					 | 
				
			||||||
		if (!(filp->f_mode & FMODE_WRITE))
 | 
					 | 
				
			||||||
			goto out;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case F_UNLCK:
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		error = -EINVAL;
 | 
					 | 
				
			||||||
		goto out;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	error = do_lock_file_wait(filp, cmd, file_lock);
 | 
						error = do_lock_file_wait(filp, cmd, file_lock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
| 
						 | 
					@ -2143,23 +2138,6 @@ int fcntl_setlk64(unsigned int fd, struct file *filp, unsigned int cmd,
 | 
				
			||||||
		file_lock->fl_flags |= FL_SLEEP;
 | 
							file_lock->fl_flags |= FL_SLEEP;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	error = -EBADF;
 | 
					 | 
				
			||||||
	switch (flock.l_type) {
 | 
					 | 
				
			||||||
	case F_RDLCK:
 | 
					 | 
				
			||||||
		if (!(filp->f_mode & FMODE_READ))
 | 
					 | 
				
			||||||
			goto out;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case F_WRLCK:
 | 
					 | 
				
			||||||
		if (!(filp->f_mode & FMODE_WRITE))
 | 
					 | 
				
			||||||
			goto out;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case F_UNLCK:
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		error = -EINVAL;
 | 
					 | 
				
			||||||
		goto out;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	error = do_lock_file_wait(filp, cmd, file_lock);
 | 
						error = do_lock_file_wait(filp, cmd, file_lock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue