You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1.5 KiB
43 lines
1.5 KiB
5 years ago
|
From 561ba41a83a8c9f4e66eb27f87e6b37e89858dcb Mon Sep 17 00:00:00 2001
|
||
|
From: Mamoru TASAKA <mtasaka@fedoraproject.org>
|
||
|
Date: Wed, 15 Apr 2020 23:15:40 +0900
|
||
|
Subject: [PATCH] ya_rand_init: avoid signed integer overflow by with recent
|
||
|
pid_max value
|
||
|
|
||
|
Recent Linux system (like Fedora) has kernel.pid_max value as 2^22
|
||
|
(= 4194304), instead of old 65536 (=2^16) value. A quick reference is:
|
||
|
https://unix.stackexchange.com/questions/231719/why-is-the-maximum-pid-in-a-64-bit-linux-system-222/231724
|
||
|
|
||
|
With this value, on ya_rand_init(), multiplying the value returned by
|
||
|
getpid() by 1003 (which is larger than 2^9) can get larger than 2^31,
|
||
|
which causes signed overflow like:
|
||
|
|
||
|
../../utils/yarandom.c:123:21: runtime error: signed integer overflow: 3774303 * 1003 cannot be represented in type 'int'
|
||
|
|
||
|
as detected by gcc10 -sanitize=undefined.
|
||
|
|
||
|
This patch avoids signed overflow by casting values with unsigned int.
|
||
|
---
|
||
|
utils/yarandom.c | 4 ++--
|
||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/utils/yarandom.c b/utils/yarandom.c
|
||
|
index f450735..0f51cb6 100644
|
||
|
--- a/utils/yarandom.c
|
||
|
+++ b/utils/yarandom.c
|
||
|
@@ -118,9 +118,9 @@ ya_rand_init(unsigned int seed)
|
||
|
#define ROT(X,N) (((X)<<(N)) | ((X)>>((sizeof(unsigned int)*8)-(N))))
|
||
|
seed = (999U * (unsigned int) tp.tv_sec);
|
||
|
seed = ROT (seed, 11);
|
||
|
- seed += (1001 * tp.tv_usec);
|
||
|
+ seed += (1001 * (unsigned int) tp.tv_usec);
|
||
|
seed = ROT (seed, 7);
|
||
|
- seed += (1003 * getpid());
|
||
|
+ seed += (1003 * (unsigned int) getpid());
|
||
|
seed = ROT (seed, 13);
|
||
|
}
|
||
|
|
||
|
--
|
||
|
2.25.2
|
||
|
|