diff options
author | Daniel Cashman <dcashman@android.com> | 2016-02-26 18:19:37 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-02-27 13:28:52 -0500 |
commit | 5ef11c35ce86b94bfb878b684de4cdaf96f54b2f (patch) | |
tree | 1ebed2840d0640a3f00b71709695cacee96c7688 /arch | |
parent | ec9ee4acd97c0039a61c0ae4f12705767ae62153 (diff) |
mm: ASLR: use get_random_long()
Replace calls to get_random_int() followed by a cast to (unsigned long)
with calls to get_random_long(). Also address shifting bug which, in
case of x86 removed entropy mask for mmap_rnd_bits values > 31 bits.
Signed-off-by: Daniel Cashman <dcashman@android.com>
Acked-by: Kees Cook <keescook@chromium.org>
Cc: "Theodore Ts'o" <tytso@mit.edu>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: David S. Miller <davem@davemloft.net>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Nick Kralevich <nnk@google.com>
Cc: Jeff Vander Stoep <jeffv@google.com>
Cc: Mark Salyzyn <salyzyn@android.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mm/mmap.c | 2 | ||||
-rw-r--r-- | arch/arm64/mm/mmap.c | 4 | ||||
-rw-r--r-- | arch/mips/mm/mmap.c | 4 | ||||
-rw-r--r-- | arch/powerpc/kernel/process.c | 4 | ||||
-rw-r--r-- | arch/powerpc/mm/mmap.c | 4 | ||||
-rw-r--r-- | arch/sparc/kernel/sys_sparc_64.c | 2 | ||||
-rw-r--r-- | arch/x86/mm/mmap.c | 6 |
7 files changed, 13 insertions, 13 deletions
diff --git a/arch/arm/mm/mmap.c b/arch/arm/mm/mmap.c index 4b4058db0781..66353caa35b9 100644 --- a/arch/arm/mm/mmap.c +++ b/arch/arm/mm/mmap.c | |||
@@ -173,7 +173,7 @@ unsigned long arch_mmap_rnd(void) | |||
173 | { | 173 | { |
174 | unsigned long rnd; | 174 | unsigned long rnd; |
175 | 175 | ||
176 | rnd = (unsigned long)get_random_int() & ((1 << mmap_rnd_bits) - 1); | 176 | rnd = get_random_long() & ((1UL << mmap_rnd_bits) - 1); |
177 | 177 | ||
178 | return rnd << PAGE_SHIFT; | 178 | return rnd << PAGE_SHIFT; |
179 | } | 179 | } |
diff --git a/arch/arm64/mm/mmap.c b/arch/arm64/mm/mmap.c index 4c893b5189dd..232f787a088a 100644 --- a/arch/arm64/mm/mmap.c +++ b/arch/arm64/mm/mmap.c | |||
@@ -53,10 +53,10 @@ unsigned long arch_mmap_rnd(void) | |||
53 | 53 | ||
54 | #ifdef CONFIG_COMPAT | 54 | #ifdef CONFIG_COMPAT |
55 | if (test_thread_flag(TIF_32BIT)) | 55 | if (test_thread_flag(TIF_32BIT)) |
56 | rnd = (unsigned long)get_random_int() & ((1 << mmap_rnd_compat_bits) - 1); | 56 | rnd = get_random_long() & ((1UL << mmap_rnd_compat_bits) - 1); |
57 | else | 57 | else |
58 | #endif | 58 | #endif |
59 | rnd = (unsigned long)get_random_int() & ((1 << mmap_rnd_bits) - 1); | 59 | rnd = get_random_long() & ((1UL << mmap_rnd_bits) - 1); |
60 | return rnd << PAGE_SHIFT; | 60 | return rnd << PAGE_SHIFT; |
61 | } | 61 | } |
62 | 62 | ||
diff --git a/arch/mips/mm/mmap.c b/arch/mips/mm/mmap.c index 5c81fdd032c3..353037699512 100644 --- a/arch/mips/mm/mmap.c +++ b/arch/mips/mm/mmap.c | |||
@@ -146,7 +146,7 @@ unsigned long arch_mmap_rnd(void) | |||
146 | { | 146 | { |
147 | unsigned long rnd; | 147 | unsigned long rnd; |
148 | 148 | ||
149 | rnd = (unsigned long)get_random_int(); | 149 | rnd = get_random_long(); |
150 | rnd <<= PAGE_SHIFT; | 150 | rnd <<= PAGE_SHIFT; |
151 | if (TASK_IS_32BIT_ADDR) | 151 | if (TASK_IS_32BIT_ADDR) |
152 | rnd &= 0xfffffful; | 152 | rnd &= 0xfffffful; |
@@ -174,7 +174,7 @@ void arch_pick_mmap_layout(struct mm_struct *mm) | |||
174 | 174 | ||
175 | static inline unsigned long brk_rnd(void) | 175 | static inline unsigned long brk_rnd(void) |
176 | { | 176 | { |
177 | unsigned long rnd = get_random_int(); | 177 | unsigned long rnd = get_random_long(); |
178 | 178 | ||
179 | rnd = rnd << PAGE_SHIFT; | 179 | rnd = rnd << PAGE_SHIFT; |
180 | /* 8MB for 32bit, 256MB for 64bit */ | 180 | /* 8MB for 32bit, 256MB for 64bit */ |
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index dccc87e8fee5..3c5736e52a14 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
@@ -1768,9 +1768,9 @@ static inline unsigned long brk_rnd(void) | |||
1768 | 1768 | ||
1769 | /* 8MB for 32bit, 1GB for 64bit */ | 1769 | /* 8MB for 32bit, 1GB for 64bit */ |
1770 | if (is_32bit_task()) | 1770 | if (is_32bit_task()) |
1771 | rnd = (long)(get_random_int() % (1<<(23-PAGE_SHIFT))); | 1771 | rnd = (get_random_long() % (1UL<<(23-PAGE_SHIFT))); |
1772 | else | 1772 | else |
1773 | rnd = (long)(get_random_int() % (1<<(30-PAGE_SHIFT))); | 1773 | rnd = (get_random_long() % (1UL<<(30-PAGE_SHIFT))); |
1774 | 1774 | ||
1775 | return rnd << PAGE_SHIFT; | 1775 | return rnd << PAGE_SHIFT; |
1776 | } | 1776 | } |
diff --git a/arch/powerpc/mm/mmap.c b/arch/powerpc/mm/mmap.c index 0f0502e12f6c..4087705ba90f 100644 --- a/arch/powerpc/mm/mmap.c +++ b/arch/powerpc/mm/mmap.c | |||
@@ -59,9 +59,9 @@ unsigned long arch_mmap_rnd(void) | |||
59 | 59 | ||
60 | /* 8MB for 32bit, 1GB for 64bit */ | 60 | /* 8MB for 32bit, 1GB for 64bit */ |
61 | if (is_32bit_task()) | 61 | if (is_32bit_task()) |
62 | rnd = (unsigned long)get_random_int() % (1<<(23-PAGE_SHIFT)); | 62 | rnd = get_random_long() % (1<<(23-PAGE_SHIFT)); |
63 | else | 63 | else |
64 | rnd = (unsigned long)get_random_int() % (1<<(30-PAGE_SHIFT)); | 64 | rnd = get_random_long() % (1UL<<(30-PAGE_SHIFT)); |
65 | 65 | ||
66 | return rnd << PAGE_SHIFT; | 66 | return rnd << PAGE_SHIFT; |
67 | } | 67 | } |
diff --git a/arch/sparc/kernel/sys_sparc_64.c b/arch/sparc/kernel/sys_sparc_64.c index c690c8e16a96..b489e9759518 100644 --- a/arch/sparc/kernel/sys_sparc_64.c +++ b/arch/sparc/kernel/sys_sparc_64.c | |||
@@ -264,7 +264,7 @@ static unsigned long mmap_rnd(void) | |||
264 | unsigned long rnd = 0UL; | 264 | unsigned long rnd = 0UL; |
265 | 265 | ||
266 | if (current->flags & PF_RANDOMIZE) { | 266 | if (current->flags & PF_RANDOMIZE) { |
267 | unsigned long val = get_random_int(); | 267 | unsigned long val = get_random_long(); |
268 | if (test_thread_flag(TIF_32BIT)) | 268 | if (test_thread_flag(TIF_32BIT)) |
269 | rnd = (val % (1UL << (23UL-PAGE_SHIFT))); | 269 | rnd = (val % (1UL << (23UL-PAGE_SHIFT))); |
270 | else | 270 | else |
diff --git a/arch/x86/mm/mmap.c b/arch/x86/mm/mmap.c index 96bd1e2bffaf..72bb52f93c3d 100644 --- a/arch/x86/mm/mmap.c +++ b/arch/x86/mm/mmap.c | |||
@@ -71,12 +71,12 @@ unsigned long arch_mmap_rnd(void) | |||
71 | 71 | ||
72 | if (mmap_is_ia32()) | 72 | if (mmap_is_ia32()) |
73 | #ifdef CONFIG_COMPAT | 73 | #ifdef CONFIG_COMPAT |
74 | rnd = (unsigned long)get_random_int() & ((1 << mmap_rnd_compat_bits) - 1); | 74 | rnd = get_random_long() & ((1UL << mmap_rnd_compat_bits) - 1); |
75 | #else | 75 | #else |
76 | rnd = (unsigned long)get_random_int() & ((1 << mmap_rnd_bits) - 1); | 76 | rnd = get_random_long() & ((1UL << mmap_rnd_bits) - 1); |
77 | #endif | 77 | #endif |
78 | else | 78 | else |
79 | rnd = (unsigned long)get_random_int() & ((1 << mmap_rnd_bits) - 1); | 79 | rnd = get_random_long() & ((1UL << mmap_rnd_bits) - 1); |
80 | 80 | ||
81 | return rnd << PAGE_SHIFT; | 81 | return rnd << PAGE_SHIFT; |
82 | } | 82 | } |