diff options
Diffstat (limited to 'arch/mips/kernel')
-rw-r--r-- | arch/mips/kernel/linux32.c | 2 | ||||
-rw-r--r-- | arch/mips/kernel/sysirix.c | 10 |
2 files changed, 9 insertions, 3 deletions
diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c index 52cada45b353..53f4171fc188 100644 --- a/arch/mips/kernel/linux32.c +++ b/arch/mips/kernel/linux32.c | |||
@@ -77,6 +77,8 @@ int cp_compat_stat(struct kstat *stat, struct compat_stat __user *statbuf) | |||
77 | memset(&tmp, 0, sizeof(tmp)); | 77 | memset(&tmp, 0, sizeof(tmp)); |
78 | tmp.st_dev = new_encode_dev(stat->dev); | 78 | tmp.st_dev = new_encode_dev(stat->dev); |
79 | tmp.st_ino = stat->ino; | 79 | tmp.st_ino = stat->ino; |
80 | if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino) | ||
81 | return -EOVERFLOW; | ||
80 | tmp.st_mode = stat->mode; | 82 | tmp.st_mode = stat->mode; |
81 | tmp.st_nlink = stat->nlink; | 83 | tmp.st_nlink = stat->nlink; |
82 | SET_UID(tmp.st_uid, stat->uid); | 84 | SET_UID(tmp.st_uid, stat->uid); |
diff --git a/arch/mips/kernel/sysirix.c b/arch/mips/kernel/sysirix.c index 11bb97174972..93c74fefff76 100644 --- a/arch/mips/kernel/sysirix.c +++ b/arch/mips/kernel/sysirix.c | |||
@@ -1739,12 +1739,13 @@ struct irix_dirent32_callback { | |||
1739 | #define ROUND_UP32(x) (((x)+sizeof(u32)-1) & ~(sizeof(u32)-1)) | 1739 | #define ROUND_UP32(x) (((x)+sizeof(u32)-1) & ~(sizeof(u32)-1)) |
1740 | 1740 | ||
1741 | static int irix_filldir32(void *__buf, const char *name, | 1741 | static int irix_filldir32(void *__buf, const char *name, |
1742 | int namlen, loff_t offset, ino_t ino, unsigned int d_type) | 1742 | int namlen, loff_t offset, u64 ino, unsigned int d_type) |
1743 | { | 1743 | { |
1744 | struct irix_dirent32 __user *dirent; | 1744 | struct irix_dirent32 __user *dirent; |
1745 | struct irix_dirent32_callback *buf = __buf; | 1745 | struct irix_dirent32_callback *buf = __buf; |
1746 | unsigned short reclen = ROUND_UP32(NAME_OFFSET32(dirent) + namlen + 1); | 1746 | unsigned short reclen = ROUND_UP32(NAME_OFFSET32(dirent) + namlen + 1); |
1747 | int err = 0; | 1747 | int err = 0; |
1748 | u32 d_ino; | ||
1748 | 1749 | ||
1749 | #ifdef DEBUG_GETDENTS | 1750 | #ifdef DEBUG_GETDENTS |
1750 | printk("\nirix_filldir32[reclen<%d>namlen<%d>count<%d>]", | 1751 | printk("\nirix_filldir32[reclen<%d>namlen<%d>count<%d>]", |
@@ -1753,12 +1754,15 @@ static int irix_filldir32(void *__buf, const char *name, | |||
1753 | buf->error = -EINVAL; /* only used if we fail.. */ | 1754 | buf->error = -EINVAL; /* only used if we fail.. */ |
1754 | if (reclen > buf->count) | 1755 | if (reclen > buf->count) |
1755 | return -EINVAL; | 1756 | return -EINVAL; |
1757 | d_ino = ino; | ||
1758 | if (sizeof(d_ino) < sizeof(ino) && d_ino != ino) | ||
1759 | return -EOVERFLOW; | ||
1756 | dirent = buf->previous; | 1760 | dirent = buf->previous; |
1757 | if (dirent) | 1761 | if (dirent) |
1758 | err = __put_user(offset, &dirent->d_off); | 1762 | err = __put_user(offset, &dirent->d_off); |
1759 | dirent = buf->current_dir; | 1763 | dirent = buf->current_dir; |
1760 | err |= __put_user(dirent, &buf->previous); | 1764 | err |= __put_user(dirent, &buf->previous); |
1761 | err |= __put_user(ino, &dirent->d_ino); | 1765 | err |= __put_user(d_ino, &dirent->d_ino); |
1762 | err |= __put_user(reclen, &dirent->d_reclen); | 1766 | err |= __put_user(reclen, &dirent->d_reclen); |
1763 | err |= copy_to_user((char __user *)dirent->d_name, name, namlen) ? -EFAULT : 0; | 1767 | err |= copy_to_user((char __user *)dirent->d_name, name, namlen) ? -EFAULT : 0; |
1764 | err |= __put_user(0, &dirent->d_name[namlen]); | 1768 | err |= __put_user(0, &dirent->d_name[namlen]); |
@@ -1837,7 +1841,7 @@ struct irix_dirent64_callback { | |||
1837 | #define ROUND_UP64(x) (((x)+sizeof(u64)-1) & ~(sizeof(u64)-1)) | 1841 | #define ROUND_UP64(x) (((x)+sizeof(u64)-1) & ~(sizeof(u64)-1)) |
1838 | 1842 | ||
1839 | static int irix_filldir64(void *__buf, const char *name, | 1843 | static int irix_filldir64(void *__buf, const char *name, |
1840 | int namlen, loff_t offset, ino_t ino, unsigned int d_type) | 1844 | int namlen, loff_t offset, u64 ino, unsigned int d_type) |
1841 | { | 1845 | { |
1842 | struct irix_dirent64 __user *dirent; | 1846 | struct irix_dirent64 __user *dirent; |
1843 | struct irix_dirent64_callback * buf = __buf; | 1847 | struct irix_dirent64_callback * buf = __buf; |