mirror of
https://github.com/systemd/systemd.git
synced 2024-12-22 17:35:35 +03:00
shared/calendarspec: fix formatting of entries which collapse to a star
We canonicalize repeats that cover the whole range: "0:0:0/1" → "0:0:*". But we'd also do "0:0:0/1,0" → "0:0:*,0", which we then refuse to parse. Thus, first go throug the whole chain, and print a '*' and nothing else if any of the components covers the whole range.
This commit is contained in:
parent
3aff2ae9d5
commit
8e1e59b9ad
@ -288,17 +288,24 @@ static void format_weekdays(FILE *f, const CalendarSpec *c) {
|
||||
}
|
||||
}
|
||||
|
||||
static void format_chain(FILE *f, int space, const CalendarComponent *c, bool usec) {
|
||||
static bool chain_is_star(const CalendarComponent *c, bool usec) {
|
||||
/* Return true if the whole chain can be replaced by '*'.
|
||||
* This happens when the chain is empty or one of the components covers all. */
|
||||
if (!c)
|
||||
return true;
|
||||
if (usec)
|
||||
for (; c; c = c->next)
|
||||
if (c->start == 0 && c->stop < 0 && c->repeat == USEC_PER_SEC)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static void _format_chain(FILE *f, int space, const CalendarComponent *c, bool start, bool usec) {
|
||||
int d = usec ? (int) USEC_PER_SEC : 1;
|
||||
|
||||
assert(f);
|
||||
|
||||
if (!c) {
|
||||
fputc('*', f);
|
||||
return;
|
||||
}
|
||||
|
||||
if (usec && c->start == 0 && c->stop < 0 && c->repeat == USEC_PER_SEC && !c->next) {
|
||||
if (start && chain_is_star(c, usec)) {
|
||||
fputc('*', f);
|
||||
return;
|
||||
}
|
||||
@ -321,10 +328,14 @@ static void format_chain(FILE *f, int space, const CalendarComponent *c, bool us
|
||||
|
||||
if (c->next) {
|
||||
fputc(',', f);
|
||||
format_chain(f, space, c->next, usec);
|
||||
_format_chain(f, space, c->next, false, usec);
|
||||
}
|
||||
}
|
||||
|
||||
static void format_chain(FILE *f, int space, const CalendarComponent *c, bool usec) {
|
||||
_format_chain(f, space, c, /* start = */ true, usec);
|
||||
}
|
||||
|
||||
int calendar_spec_to_string(const CalendarSpec *c, char **p) {
|
||||
char *buf = NULL;
|
||||
size_t sz = 0;
|
||||
|
@ -164,6 +164,7 @@ TEST(calendar_spec_one) {
|
||||
test_one("00:00:01/2,02..03", "*-*-* 00:00:01/2,02..03");
|
||||
test_one("*:4,30:0..3", "*-*-* *:04,30:00..03");
|
||||
test_one("*:4,30:0/1", "*-*-* *:04,30:*");
|
||||
test_one("*:4,30:0/1,3,5", "*-*-* *:04,30:*");
|
||||
test_one("*-*~1 Utc", "*-*~01 00:00:00 UTC");
|
||||
test_one("*-*~05,3 ", "*-*~03,05 00:00:00");
|
||||
test_one("*-*~* 00:00:00", "*-*-* 00:00:00");
|
||||
|
1
test/fuzz/fuzz-calendarspec/crash-parse-star-non-star
Normal file
1
test/fuzz/fuzz-calendarspec/crash-parse-star-non-star
Normal file
@ -0,0 +1 @@
|
||||
*:4,30:0/01,0
|
Loading…
Reference in New Issue
Block a user