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] */