]> granicus.if.org Git - cronie/commitdiff
Use unbiased random number for RANDOM_DELAY.
authorTomas Mraz <tmraz@fedoraproject.org>
Wed, 28 Jan 2015 16:50:36 +0000 (17:50 +0100)
committerTomas Mraz <tmraz@fedoraproject.org>
Wed, 28 Jan 2015 16:50:36 +0000 (17:50 +0100)
- also fix possible division by 0

anacron/readtab.c

index fef04d9fa7b0ee05e5604f07bbf34bb6a978a92f..d01b4fa0ba4788761984297ab84978cd0f8c9a63 100644 (file)
@@ -239,6 +239,21 @@ register_period_job(const char *periods, const char *delays,
          jr->named_period, jr->delay, jr->ident, jr->command));
 }
 
+static long int
+unbiased_rand(long int max)
+{
+    long int rn;
+    long int divisor;
+
+    divisor = RAND_MAX / (max + 1);
+
+    do {
+        rn = random() / divisor;
+    } while (rn > max);
+
+    return rn;
+}
+
 static void
 parse_tab_line(char *line)
 {
@@ -282,16 +297,11 @@ parse_tab_line(char *line)
             Debug(("Jobs will start in the %02d:00-%02d:00 range.", range_start, range_stop));
         }
         if (strncmp(env_var, "RANDOM_DELAY", 12) == 0) {
-            int i;
-            double x;
-
             r = match_rx("^([[:digit:]]+)$", value, 0);
             if (r == -1) goto reg_err;
             if (r == 0) goto reg_invalid;
 
-            i = random();
-            x = (double) i / (double) RAND_MAX * (double) (atoi(value));
-            random_number = (int)x;
+            random_number = (int)unbiased_rand(atoi(value));
             Debug(("Randomized delay set: %d", random_number));
         }
         if (strncmp(env_var, "PREFERRED_HOUR", 14) == 0) {