...instead of calling random(), to make static checkers happy.
I don't think that an attacker could actually gain anything by making
router advertisement intervals predictable, but a doubt remains, and
this is cheap enough that we might just want to do this to get rid of
the noise from static checkers informing us that random() shouldn't be
used.
Signed-off-by: Stefano Brivio
---
v2: Turn random_part to uint32_t and cast to time_t before using it, to
avoid using negative values
ndp.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/ndp.c b/ndp.c
index 1f2bcb0..439fc0c 100644
--- a/ndp.c
+++ b/ndp.c
@@ -413,6 +413,7 @@ void ndp_timer(const struct ctx *c, const struct timespec *now)
{
time_t max_rtr_adv_interval = DEFAULT_MAX_RTR_ADV_INTERVAL;
time_t min_rtr_adv_interval, interval;
+ uint32_t random_part;
if (!tap_is_ready(c) || c->no_ra || now->tv_sec < next_ra)
return;
@@ -433,15 +434,18 @@ void ndp_timer(const struct ctx *c, const struct timespec *now)
* and causing flurries of RAs at the same time.
*
* This random doesn't need to be cryptographically strong, so random(3)
- * is fine. Other routers on the link also want to avoid
- * synchronisation, and anything malicious has much easier ways to cause
- * trouble.
+ * would be fine. Other routers on the link also want to avoid
+ * synchronisation, and anything malicious would have much easier ways
+ * to cause trouble. However, for the sake of static checkers, use high
+ * quality entropy as provided by raw_random().
*
* The modulus also makes this not strictly a uniform distribution, but,
* again, it's close enough for our purposes.
*/
+ raw_random(&random_part, sizeof(random_part));
interval = min_rtr_adv_interval +
- random() % (max_rtr_adv_interval - min_rtr_adv_interval);
+ (time_t)random_part % (max_rtr_adv_interval -
+ min_rtr_adv_interval);
if (!next_ra)
goto first;
--
2.43.0