[PATCH] move_pages: fix 32 -> 64 bit compat function
The definition of the third parameter is a pointer to an array of virtual addresses which give us some trouble. The existing code calculated the wrong address in the array since I used void to avoid having to specify a type. I now use the correct type "compat_uptr_t __user *" in the definition of the function in kernel/compat.c. However, I used __u32 in syscalls.h. Would have to include compat.h there in order to provide the same definition which would generate an ugly include situation. On both ia64 and x86_64 compat_uptr_t is u32. So this works although parameter declarations differ. Signed-off-by: Christoph Lameter <clameter@sgi.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
1b2db9fb7a
commit
9216dfad4f
|
@ -522,7 +522,7 @@ asmlinkage long sys_move_pages(pid_t pid, unsigned long nr_pages,
|
|||
int __user *status,
|
||||
int flags);
|
||||
asmlinkage long compat_sys_move_pages(pid_t pid, unsigned long nr_page,
|
||||
void __user *pages,
|
||||
__u32 __user *pages,
|
||||
const int __user *nodes,
|
||||
int __user *status,
|
||||
int flags);
|
||||
|
|
|
@ -938,7 +938,7 @@ asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp)
|
|||
|
||||
#ifdef CONFIG_NUMA
|
||||
asmlinkage long compat_sys_move_pages(pid_t pid, unsigned long nr_pages,
|
||||
void __user *pages32,
|
||||
compat_uptr_t __user *pages32,
|
||||
const int __user *nodes,
|
||||
int __user *status,
|
||||
int flags)
|
||||
|
@ -950,7 +950,7 @@ asmlinkage long compat_sys_move_pages(pid_t pid, unsigned long nr_pages,
|
|||
for (i = 0; i < nr_pages; i++) {
|
||||
compat_uptr_t p;
|
||||
|
||||
if (get_user(p, (compat_uptr_t *)(pages32 + i)) ||
|
||||
if (get_user(p, pages32 + i) ||
|
||||
put_user(compat_ptr(p), pages + i))
|
||||
return -EFAULT;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue