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.
42 lines
1.5 KiB
42 lines
1.5 KiB
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 |
|
|
|
|