Patch "drivers: char: random: add get_random_long()" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
drivers: char: random: add get_random_long()
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drivers-char-random-add-get_random_long.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
ec9ee4acd97c0039a61c0ae4f12705767ae62153Mon Sep 17 00:00:00 2001
From: Daniel Cashman <[email protected]>
Date: Fri, 26 Feb 2016 15:19:34 -0800
Subject: drivers: char: random: add get_random_long()
From: Daniel Cashman <[email protected]>
commit ec9ee4acd97c0039a61c0ae4f12705767ae62153 upstream.
Commit d07e22597d1d ("mm: mmap: add new /proc tunable for mmap_base ASLR") added the ability to choose from a range of values to use for entropy count in generating the random offset to the mmap_base address.
The maximum value on this range was set to 32 bits for 64-bit x86 systems, but this value could be increased further, requiring more than the 32 bits of randomness provided by get_random_int(), as is already possible for arm64. Add a new function: get_random_long() which more naturally fits with the mmap usage of get_random_int() but operates exactly the same as get_random_int().
Also, fix the shifting constant in mmap_rnd() to be an unsigned long so that values greater than 31 bits generate an appropriate mask without overflow. This is especially important on x86, as its shift instruction uses a 5-bit mask for the shift operand, which meant that any value for mmap_rnd_bits over 31 acts as a no-op and effectively disables mmap_base randomization.
Finally, replace calls to get_random_int() with get_random_long() where appropriate.
This patch (of 2):
Add get_random_long().
--- drivers/char/random.c | 22 ++++++++++++++++++++++ include/linux/random.h | 1 + 2 files changed, 23 insertions(+)
drivers/char/random.c +22 -0
@@ -1825,6 +1825,28 @@ unsigned int get_random_int(void)EXPORT_SYMBOL (get_random_int);/* +* Same as get_random_int(), but returns unsigned long. +*/ +unsigned long get_random_long (void ) +{ +__u32 *hash; +unsigned long ret; + +if (arch_get_random_long (&ret)) +return ret; + + hash =get_cpu_var (get_random_int_hash); + + hash[0 ] += current->pid + jiffies +random_get_entropy (); +md5_transform (hash, random_int_secret); + ret = *(unsigned long *)hash; +put_cpu_var (get_random_int_hash); + +return ret; +} +EXPORT_SYMBOL (get_random_long); + +/* * randomize_range() returns a start address such that * * [...... <range> .....]
include/linux/random.h +1 -0
@@ -34,6 +34,7 @@ extern const struct file_operations rand#endif unsigned int get_random_int (void ); +unsigned long get_random_long (void );unsigned long randomize_range (unsigned long start,unsigned long end,unsigned long len);u32 prandom_u32 (void );
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/drivers-char-random-add-get_random_long.patch