diff options
Diffstat (limited to 'fs/readdir.c')
| -rw-r--r-- | fs/readdir.c | 33 | 
1 files changed, 14 insertions, 19 deletions
diff --git a/fs/readdir.c b/fs/readdir.c index cc0a8227cdd..39e3370d79c 100644 --- a/fs/readdir.c +++ b/fs/readdir.c @@ -108,11 +108,11 @@ SYSCALL_DEFINE3(old_readdir, unsigned int, fd,  	int error;  	struct file * file;  	struct readdir_callback buf; +	int fput_needed; -	error = -EBADF; -	file = fget(fd); +	file = fget_light(fd, &fput_needed);  	if (!file) -		goto out; +		return -EBADF;  	buf.result = 0;  	buf.dirent = dirent; @@ -121,8 +121,7 @@ SYSCALL_DEFINE3(old_readdir, unsigned int, fd,  	if (buf.result)  		error = buf.result; -	fput(file); -out: +	fput_light(file, fput_needed);  	return error;  } @@ -195,16 +194,15 @@ SYSCALL_DEFINE3(getdents, unsigned int, fd,  	struct file * file;  	struct linux_dirent __user * lastdirent;  	struct 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; @@ -221,8 +219,7 @@ SYSCALL_DEFINE3(getdents, unsigned int, fd,  		else  			error = count - buf.count;  	} -	fput(file); -out: +	fput_light(file, fput_needed);  	return error;  } @@ -278,16 +275,15 @@ SYSCALL_DEFINE3(getdents64, unsigned int, fd,  	struct file * file;  	struct linux_dirent64 __user * lastdirent;  	struct 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; @@ -305,7 +301,6 @@ SYSCALL_DEFINE3(getdents64, unsigned int, fd,  		else  			error = count - buf.count;  	} -	fput(file); -out: +	fput_light(file, fput_needed);  	return error;  }  |