]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
shared/calendarspec: fix printing of second ranges which start with 0
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 10 May 2022 08:25:01 +0000 (10:25 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 10 May 2022 11:06:32 +0000 (13:06 +0200)
0..3 is not the same as 0..infinity, we need to check both ends of the range.
This logic was added in 3215e35c405278491f55fb486d349f132e93f516, and back then
the field was called .value. .stop was added later and apparently wasn't taken
into account here.

src/shared/calendarspec.c
src/test/test-calendarspec.c
test/fuzz/fuzz-calendarspec/cant-parse-printed [new file with mode: 0644]
test/fuzz/fuzz-calendarspec/print-loses-spec [new file with mode: 0644]

index 51ade0e887122cffa9c5bb155c67d44d423da05d..273a38f1fa419508fbf2cbe26c05eb7270ed2349 100644 (file)
@@ -298,7 +298,7 @@ static void format_chain(FILE *f, int space, const CalendarComponent *c, bool us
                 return;
         }
 
-        if (usec && c->start == 0 && c->repeat == USEC_PER_SEC && !c->next) {
+        if (usec && c->start == 0 && c->stop < 0 && c->repeat == USEC_PER_SEC && !c->next) {
                 fputc('*', f);
                 return;
         }
index cf6965dd3c34e832769cc6d910256f530a128546..5508f8b8337ca9b2cda8e15507ef03cca816424e 100644 (file)
@@ -162,6 +162,8 @@ TEST(calendar_spec_one) {
         test_one("00:00:1.0..3.8", "*-*-* 00:00:01..03");
         test_one("00:00:01..03", "*-*-* 00:00:01..03");
         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("*-*~1 Utc", "*-*~01 00:00:00 UTC");
         test_one("*-*~05,3 ", "*-*~03,05 00:00:00");
         test_one("*-*~* 00:00:00", "*-*-* 00:00:00");
@@ -252,6 +254,9 @@ TEST(calendar_spec_from_string) {
         assert_se(calendar_spec_from_string("00:00:2300", &c) == -ERANGE);
         assert_se(calendar_spec_from_string("00:00:18446744073709551615", &c) == -ERANGE);
         assert_se(calendar_spec_from_string("@88588582097858858", &c) == -ERANGE);
+        assert_se(calendar_spec_from_string("*:4,30:*,5", &c) == -EINVAL);
+        assert_se(calendar_spec_from_string("*:4,30:5,*", &c) == -EINVAL);
+        assert_se(calendar_spec_from_string("*:4,30:*\n", &c) == -EINVAL);
 }
 
 DEFINE_TEST_MAIN(LOG_INFO);
diff --git a/test/fuzz/fuzz-calendarspec/cant-parse-printed b/test/fuzz/fuzz-calendarspec/cant-parse-printed
new file mode 100644 (file)
index 0000000..e2c82a6
--- /dev/null
@@ -0,0 +1 @@
+*:4,30:0..5,0
\ No newline at end of file
diff --git a/test/fuzz/fuzz-calendarspec/print-loses-spec b/test/fuzz/fuzz-calendarspec/print-loses-spec
new file mode 100644 (file)
index 0000000..5e36de2
--- /dev/null
@@ -0,0 +1 @@
+*:4,30:0..3
\ No newline at end of file