diff options
Diffstat (limited to 'fs/compat.c')
| -rw-r--r-- | fs/compat.c | 33 | 
1 files changed, 14 insertions, 19 deletions
diff --git a/fs/compat.c b/fs/compat.c index 0781e619a62..9f77486414b 100644 --- a/fs/compat.c +++ b/fs/compat.c @@ -871,12 +871,12 @@ asmlinkage long compat_sys_old_readdir(unsigned int fd,  {  	int error;  	struct file *file; +	int fput_needed;  	struct compat_readdir_callback buf; -	error = -EBADF; -	file = fget(fd); +	file = fget_light(fd, &fput_needed);  	if (!file) -		goto out; +		return -EBADF;  	buf.result = 0;  	buf.dirent = dirent; @@ -885,8 +885,7 @@ asmlinkage long compat_sys_old_readdir(unsigned int fd,  	if (buf.result)  		error = buf.result; -	fput(file); -out: +	fput_light(file, fput_needed);  	return error;  } @@ -953,16 +952,15 @@ asmlinkage long compat_sys_getdents(unsigned int fd,  	struct file * file;  	struct compat_linux_dirent __user * lastdirent;  	struct compat_getdents_callback buf; +	int fput_needed;  	int error; -	error = -EFAULT;  	if (!access_ok(VERIFY_WRITE, dirent, count)) -		goto out; +		return -EFAULT; -	error = -EBADF; -	file = fget(fd); +	file = fget_light(fd, &fput_needed);  	if (!file) -		goto out; +		return -EBADF;  	buf.current_dir = dirent;  	buf.previous = NULL; @@ -979,8 +977,7 @@ asmlinkage long compat_sys_getdents(unsigned int fd,  		else  			error = count - buf.count;  	} -	fput(file); -out: +	fput_light(file, fput_needed);  	return error;  } @@ -1041,16 +1038,15 @@ asmlinkage long compat_sys_getdents64(unsigned int fd,  	struct file * file;  	struct linux_dirent64 __user * lastdirent;  	struct compat_getdents_callback64 buf; +	int fput_needed;  	int error; -	error = -EFAULT;  	if (!access_ok(VERIFY_WRITE, dirent, count)) -		goto out; +		return -EFAULT; -	error = -EBADF; -	file = fget(fd); +	file = fget_light(fd, &fput_needed);  	if (!file) -		goto out; +		return -EBADF;  	buf.current_dir = dirent;  	buf.previous = NULL; @@ -1068,8 +1064,7 @@ asmlinkage long compat_sys_getdents64(unsigned int fd,  		else  			error = count - buf.count;  	} -	fput(file); -out: +	fput_light(file, fput_needed);  	return error;  }  #endif /* ! __ARCH_OMIT_COMPAT_SYS_GETDENTS64 */  |