[2/2] MIPS: Don't clobber personality bits in 32-bit sys_personality().

Message ID 1288658588-26801-2-git-send-email-ddaney@caviumnetworks.com
State Accepted
Delegated to: Ralf Baechle
Headers show

Commit Message

David Daney Nov. 2, 2010, 12:43 a.m.
If PER_LINUX32 has been set on a 32-bit kernel, only twiddle with the
low-order personality bits, let the upper bits pass through.

Signed-off-by: David Daney <ddaney@caviumnetworks.com>
Cc: Camm Maguire <camm@maguirefamily.org>
---
 arch/mips/kernel/linux32.c |   12 ++++++------
 1 files changed, 6 insertions(+), 6 deletions(-)

Comments

Sergei Shtylyov Nov. 2, 2010, 4:11 p.m. | #1
Hello.

David Daney wrote:

> If PER_LINUX32 has been set on a 32-bit kernel, only twiddle with the
> low-order personality bits, let the upper bits pass through.

> Signed-off-by: David Daney <ddaney@caviumnetworks.com>
> Cc: Camm Maguire <camm@maguirefamily.org>
> ---
>  arch/mips/kernel/linux32.c |   12 ++++++------
>  1 files changed, 6 insertions(+), 6 deletions(-)

> diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c
> index 6343b4a..a63f4e2 100644
> --- a/arch/mips/kernel/linux32.c
> +++ b/arch/mips/kernel/linux32.c
> @@ -252,13 +252,13 @@ SYSCALL_DEFINE5(n32_msgrcv, int, msqid, u32, msgp, size_t, msgsz,
>  SYSCALL_DEFINE1(32_personality, unsigned long, personality)
>  {
>  	int ret;
> -	personality &= 0xffffffff;
> +	unsigned int p = personality & 0xffffffff;

    I'd have inserted an empty line here...

>  	if (personality(current->personality) == PER_LINUX32 &&
> -	    personality == PER_LINUX)
> -		personality = PER_LINUX32;
> -	ret = sys_personality(personality);
> -	if (ret == PER_LINUX32)
> -		ret = PER_LINUX;
> +	    personality(p) == PER_LINUX)
> +		p = (p & ~PER_MASK) | PER_LINUX32;
> +	ret = sys_personality(p);
> +	if (ret != -1 && personality(ret) == PER_LINUX32)
> +		ret = (ret & ~PER_MASK) | PER_LINUX;
>  	return ret;
>  }

WBR, Sergei
root Nov. 5, 2010, 3:17 p.m. | #2
Applied, including some whitespace whitewash according to my personal
religion :)

Thanks,

  Ralf

Patch

diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c
index 6343b4a..a63f4e2 100644
--- a/arch/mips/kernel/linux32.c
+++ b/arch/mips/kernel/linux32.c
@@ -252,13 +252,13 @@  SYSCALL_DEFINE5(n32_msgrcv, int, msqid, u32, msgp, size_t, msgsz,
 SYSCALL_DEFINE1(32_personality, unsigned long, personality)
 {
 	int ret;
-	personality &= 0xffffffff;
+	unsigned int p = personality & 0xffffffff;
 	if (personality(current->personality) == PER_LINUX32 &&
-	    personality == PER_LINUX)
-		personality = PER_LINUX32;
-	ret = sys_personality(personality);
-	if (ret == PER_LINUX32)
-		ret = PER_LINUX;
+	    personality(p) == PER_LINUX)
+		p = (p & ~PER_MASK) | PER_LINUX32;
+	ret = sys_personality(p);
+	if (ret != -1 && personality(ret) == PER_LINUX32)
+		ret = (ret & ~PER_MASK) | PER_LINUX;
 	return ret;
 }