aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorDaniel Cashman <dcashman@android.com>2016-02-26 18:19:37 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2016-02-27 13:28:52 -0500
commit5ef11c35ce86b94bfb878b684de4cdaf96f54b2f (patch)
tree1ebed2840d0640a3f00b71709695cacee96c7688 /arch
parentec9ee4acd97c0039a61c0ae4f12705767ae62153 (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.c2
-rw-r--r--arch/arm64/mm/mmap.c4
-rw-r--r--arch/mips/mm/mmap.c4
-rw-r--r--arch/powerpc/kernel/process.c4
-rw-r--r--arch/powerpc/mm/mmap.c4
-rw-r--r--arch/sparc/kernel/sys_sparc_64.c2
-rw-r--r--arch/x86/mm/mmap.c6
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
175static inline unsigned long brk_rnd(void) 175static 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}