1
0
Fork 0
mirror of synced 2025-03-06 20:59:54 +01:00

s390/kaslr: avoid mixing valid random value and an error code

0 is a valid random value. To avoid mixing it with error code 0 as an
return code make get_random() take extra argument to output random
value and return an error code.

Reviewed-by: Philipp Rudo <prudo@linux.ibm.com>
Reviewed-by: Alexander Egorenkov <egorenar@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
This commit is contained in:
Vasily Gorbik 2020-09-23 09:37:43 +02:00
parent 62aacabc13
commit 07a699bc43

View file

@ -42,7 +42,7 @@ static int check_prng(void)
return PRNG_MODE_TDES; return PRNG_MODE_TDES;
} }
static unsigned long get_random(unsigned long limit) static int get_random(unsigned long limit, unsigned long *value)
{ {
struct prng_parm prng = { struct prng_parm prng = {
/* initial parameter block for tdes mode, copied from libica */ /* initial parameter block for tdes mode, copied from libica */
@ -84,9 +84,10 @@ static unsigned long get_random(unsigned long limit)
(u8 *) &random, sizeof(random)); (u8 *) &random, sizeof(random));
break; break;
default: default:
random = 0; return -1;
} }
return random % limit; *value = random % limit;
return 0;
} }
unsigned long get_random_base(unsigned long safe_addr) unsigned long get_random_base(unsigned long safe_addr)
@ -143,8 +144,7 @@ unsigned long get_random_base(unsigned long safe_addr)
return 0; return 0;
} }
base = get_random(block_sum); if (get_random(block_sum, &base))
if (base == 0)
return 0; return 0;
if (base < safe_addr) if (base < safe_addr)
base = safe_addr; base = safe_addr;