This fixes two issues with the parsing of random values:

1) A random value with a step is now rejected.  For example:

    ~/10    * * * * echo invalid
    0~59/10 * * * * echo invalid
    10~/10  * * * * echo invalid
    ~40/10  * * * * echo invalid

    Previously, the '/' would just be discarded.

2) The high and low random bound values are now checked.  Previously,
   only the randomized number was bounds-checked (which is usually
   too late).  This is more consistent with the behavior of ranges
   (low-high).  The following invalid entry is now rejected.

    0~60  * * * * echo max minute is 59

   Whereas before it would work most (but not all!) of the time.

OK?

 - todd

diff -u -p -u -r1.53 entry.c
--- usr.sbin/cron/entry.c       21 May 2022 01:21:29 -0000      1.53
+++ usr.sbin/cron/entry.c       4 May 2023 21:19:40 -0000
@@ -498,12 +498,17 @@ get_range(bitstr_t *bits, int low, int h
                        /* get the (optional) number following the tilde
                         */
                        ch = get_number(&num2, low, names, ch, file, ", \t\n");
-                       if (ch == EOF)
+                       if (ch == EOF) {
+                               /* no second number, check for valid terminator
+                                */
                                ch = get_char(file);
-                       if (ch == EOF || num1 > num2) {
-                               unget_char(ch, file);
-                               return (EOF);
+                               if (!strchr(", \t\n", ch)) {
+                                   unget_char(ch, file);
+                                   return (EOF);
+                               }
                        }
+                       if (num1 > num2 || num1 < low || num2 > high)
+                               return (EOF);
 
                        /* get a random number in the interval [num1, num2]
                         */

Reply via email to