diff options
author | Dmitry V. Levin <ldv@altlinux.org> | 2015-12-27 02:13:27 +0300 |
---|---|---|
committer | Sasha Levin <sasha.levin@oracle.com> | 2016-02-03 16:23:15 -0500 |
commit | 5301c0647782e71150361a3854ccf3e004b79bb9 (patch) | |
tree | 7c8f3843e18ae6ccd43b8f2110b280dd0f165750 | |
parent | 2a048a248fad2e7d49a3a5c8b9259f403182b5ac (diff) | |
download | lwn-5301c0647782e71150361a3854ccf3e004b79bb9.tar.gz lwn-5301c0647782e71150361a3854ccf3e004b79bb9.zip |
sparc64: fix incorrect sign extension in sys_sparc64_personality
[ Upstream commit 525fd5a94e1be0776fa652df5c687697db508c91 ]
The value returned by sys_personality has type "long int".
It is saved to a variable of type "int", which is not a problem
yet because the type of task_struct->pesonality is "unsigned int".
The problem is the sign extension from "int" to "long int"
that happens on return from sys_sparc64_personality.
For example, a userspace call personality((unsigned) -EINVAL) will
result to any subsequent personality call, including absolutely
harmless read-only personality(0xffffffff) call, failing with
errno set to EINVAL.
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
Cc: <stable@vger.kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
-rw-r--r-- | arch/sparc/kernel/sys_sparc_64.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/arch/sparc/kernel/sys_sparc_64.c b/arch/sparc/kernel/sys_sparc_64.c index 30e7ddb27a3a..c690c8e16a96 100644 --- a/arch/sparc/kernel/sys_sparc_64.c +++ b/arch/sparc/kernel/sys_sparc_64.c @@ -413,7 +413,7 @@ out: SYSCALL_DEFINE1(sparc64_personality, unsigned long, personality) { - int ret; + long ret; if (personality(current->personality) == PER_LINUX32 && personality(personality) == PER_LINUX) |