diff options
Diffstat (limited to 'arch/x86_64')
-rw-r--r-- | arch/x86_64/ia32/sys_ia32.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/arch/x86_64/ia32/sys_ia32.c b/arch/x86_64/ia32/sys_ia32.c index 26a01717cc1a..c9bac3af29d6 100644 --- a/arch/x86_64/ia32/sys_ia32.c +++ b/arch/x86_64/ia32/sys_ia32.c | |||
@@ -76,6 +76,8 @@ | |||
76 | 76 | ||
77 | int cp_compat_stat(struct kstat *kbuf, struct compat_stat __user *ubuf) | 77 | int cp_compat_stat(struct kstat *kbuf, struct compat_stat __user *ubuf) |
78 | { | 78 | { |
79 | compat_ino_t ino; | ||
80 | |||
79 | typeof(ubuf->st_uid) uid = 0; | 81 | typeof(ubuf->st_uid) uid = 0; |
80 | typeof(ubuf->st_gid) gid = 0; | 82 | typeof(ubuf->st_gid) gid = 0; |
81 | SET_UID(uid, kbuf->uid); | 83 | SET_UID(uid, kbuf->uid); |
@@ -84,9 +86,12 @@ int cp_compat_stat(struct kstat *kbuf, struct compat_stat __user *ubuf) | |||
84 | return -EOVERFLOW; | 86 | return -EOVERFLOW; |
85 | if (kbuf->size >= 0x7fffffff) | 87 | if (kbuf->size >= 0x7fffffff) |
86 | return -EOVERFLOW; | 88 | return -EOVERFLOW; |
89 | ino = kbuf->ino; | ||
90 | if (sizeof(ino) < sizeof(kbuf->ino) && ino != kbuf->ino) | ||
91 | return -EOVERFLOW; | ||
87 | if (!access_ok(VERIFY_WRITE, ubuf, sizeof(struct compat_stat)) || | 92 | if (!access_ok(VERIFY_WRITE, ubuf, sizeof(struct compat_stat)) || |
88 | __put_user (old_encode_dev(kbuf->dev), &ubuf->st_dev) || | 93 | __put_user (old_encode_dev(kbuf->dev), &ubuf->st_dev) || |
89 | __put_user (kbuf->ino, &ubuf->st_ino) || | 94 | __put_user (ino, &ubuf->st_ino) || |
90 | __put_user (kbuf->mode, &ubuf->st_mode) || | 95 | __put_user (kbuf->mode, &ubuf->st_mode) || |
91 | __put_user (kbuf->nlink, &ubuf->st_nlink) || | 96 | __put_user (kbuf->nlink, &ubuf->st_nlink) || |
92 | __put_user (uid, &ubuf->st_uid) || | 97 | __put_user (uid, &ubuf->st_uid) || |