[SPARC64]: 8-byte align return value from compat_alloc_user_space()
authorDavid S. Miller <davem@sunset.davemloft.net>
Mon, 23 Oct 2006 04:53:30 +0000 (21:53 -0700)
committerDavid S. Miller <davem@sunset.davemloft.net>
Mon, 23 Oct 2006 04:53:30 +0000 (21:53 -0700)
Otherwise we get a ton of unaligned exceptions, for cases such
as compat_sys_msgrcv() which go:

p = compat_alloc_user_space(second + sizeof(struct msgbuf));

and here 'second' can for example be an arbitrary odd value.

Based upon a bug report from Jurij Smakov.

Signed-off-by: David S. Miller <davem@davemloft.net>
include/asm-sparc64/compat.h

index c73935dc7ba11c8e800b79596d6ae27e3431fd30..36511ca514165b4307033de76e7b09db646509c1 100644 (file)
@@ -164,7 +164,7 @@ static inline compat_uptr_t ptr_to_compat(void __user *uptr)
        return (u32)(unsigned long)uptr;
 }
 
-static __inline__ void __user *compat_alloc_user_space(long len)
+static inline void __user *compat_alloc_user_space(long len)
 {
        struct pt_regs *regs = current_thread_info()->kregs;
        unsigned long usp = regs->u_regs[UREG_I6];
@@ -174,7 +174,10 @@ static __inline__ void __user *compat_alloc_user_space(long len)
        else
                usp &= 0xffffffffUL;
 
-       return (void __user *) (usp - len);
+       usp -= len;
+       usp &= ~0x7UL;
+
+       return (void __user *) usp;
 }
 
 struct compat_ipc64_perm {