summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandr Andreev <aandreev@openvz.org>2007-03-06 13:44:13 +0300
committerKyle McMartin <kyle@athena.road.mcmartin.ca>2007-05-23 06:42:56 +0400
commit2c8307f63dd5caaf7ff8ad5118951e559a9ed5c8 (patch)
tree2dba2da76dce00fe73374f02ed7c72b1d8b11373
parent01da41b86f6e5f9a724e20a63f093d77e37d8056 (diff)
downloadlinux-2c8307f63dd5caaf7ff8ad5118951e559a9ed5c8.tar.xz
parisc: sync compat getdents
Add VERIFY_WRITE check in the beginning like compat_sys_getdents() EFAULT on parisc if put_user() fails. Signed-off-by: Alexandr Andreev <aandreev@openvz.org> Signed-off-by: Alexey Dobriyan <adobriyan@openvz.org> Cc: Kyle McMartin <kyle@mcmartin.ca> Cc: Matthew Wilcox <willy@debian.org> Cc: Grant Grundler <grundler@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
-rw-r--r--arch/parisc/kernel/sys_parisc32.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/arch/parisc/kernel/sys_parisc32.c b/arch/parisc/kernel/sys_parisc32.c
index ce3245f87fdd..a8ebac4fadec 100644
--- a/arch/parisc/kernel/sys_parisc32.c
+++ b/arch/parisc/kernel/sys_parisc32.c
@@ -350,6 +350,10 @@ sys32_getdents (unsigned int fd, void __user * dirent, unsigned int count)
struct getdents32_callback buf;
int error;
+ error = -EFAULT;
+ if (!access_ok(VERIFY_WRITE, dirent, count))
+ goto out;
+
error = -EBADF;
file = fget(fd);
if (!file)
@@ -366,8 +370,10 @@ sys32_getdents (unsigned int fd, void __user * dirent, unsigned int count)
error = buf.error;
lastdirent = buf.previous;
if (lastdirent) {
- put_user(file->f_pos, &lastdirent->d_off);
- error = count - buf.count;
+ if (put_user(file->f_pos, &lastdirent->d_off))
+ error = -EFAULT;
+ else
+ error = count - buf.count;
}
out_putf: