diff --git a/lib/Recur/RRuleIterator.php b/lib/Recur/RRuleIterator.php index 1513cf125..ea804dd63 100644 --- a/lib/Recur/RRuleIterator.php +++ b/lib/Recur/RRuleIterator.php @@ -921,6 +921,15 @@ protected function parseRRule($rrule) case 'BYMONTHDAY': $this->byMonthDay = (array) $value; + foreach ($this->byMonthDay as $byMonthDay) { + if (!is_numeric($byMonthDay)) { + throw new InvalidDataException('BYMONTHDAY in RRULE has a not numeric value(s)!'); + } + $byMonthDay = (int) $byMonthDay; + if ($byMonthDay < -31 || 0 === $byMonthDay || $byMonthDay > 31) { + throw new InvalidDataException('BYMONTHDAY in RRULE must have value(s) from 1 to 31, or -31 to -1!'); + } + } break; case 'BYYEARDAY': diff --git a/tests/VObject/Recur/RRuleIteratorTest.php b/tests/VObject/Recur/RRuleIteratorTest.php index 92cab901b..e5d37d05a 100644 --- a/tests/VObject/Recur/RRuleIteratorTest.php +++ b/tests/VObject/Recur/RRuleIteratorTest.php @@ -10,16 +10,6 @@ class RRuleIteratorTest extends TestCase { - public function testInvalidMissingFreq() - { - $this->expectException(InvalidDataException::class); - $this->parse( - 'COUNT=6;BYMONTHDAY=24;BYMONTH=1', - '2011-04-07 00:00:00', - [] - ); - } - public function testHourly() { $this->parse( @@ -316,6 +306,16 @@ public function testMonthlyByMonthDay() ); } + public function testInvalidByMonthDay() + { + $this->expectException(InvalidDataException::class); + $this->parse( + 'FREQ=MONTHLY;COUNT=6;BYMONTHDAY=1,5,10,42', + '2011-04-07 00:00:00', + [] + ); + } + public function testMonthlyByDay() { $this->parse( @@ -895,6 +895,16 @@ public function testInvalidFreq() ); } + public function testInvalidMissingFreq() + { + $this->expectException(InvalidDataException::class); + $this->parse( + 'COUNT=6;BYMONTHDAY=24;BYMONTH=1', + '2011-04-07 00:00:00', + [] + ); + } + /** * @expectedException \Sabre\VObject\InvalidDataException */