Ensure bysetpos is in an acceptable range.
diff --git a/dateutil/rrule.py b/dateutil/rrule.py
index 108b536..f9dcf62 100644
--- a/dateutil/rrule.py
+++ b/dateutil/rrule.py
@@ -257,9 +257,16 @@
if bysetpos is None:
self._bysetpos = None
elif type(bysetpos) is int:
+ if bysetpos == 0 or not (-366 <= bysetpos <= 366):
+ raise ValueError("bysetpos must be between 1 and 366, "
+ "or between -366 and -1")
self._bysetpos = (bysetpos,)
else:
self._bysetpos = tuple(bysetpos)
+ for pos in self._bysetpos:
+ if pos == 0 or not (-366 <= pos <= 366):
+ raise ValueError("bysetpos must be between 1 and 366, "
+ "or between -366 and -1")
if not (byweekno or byyearday or bymonthday or
byweekday is not None or byeaster is not None):
if freq == YEARLY:
diff --git a/test.py b/test.py
index 734979c..ff67105 100644
--- a/test.py
+++ b/test.py
@@ -2933,6 +2933,19 @@
datetime(1998, 1, 6, 9, 0),
datetime(1998, 12, 31, 9, 0)])
+ def testBadBySetPos(self):
+ self.assertRaises(ValueError,
+ rrule, MONTHLY,
+ count=1,
+ bysetpos=0,
+ dtstart=parse("19970902T090000"))
+
+ def testBadBySetPosMany(self):
+ self.assertRaises(ValueError,
+ rrule, MONTHLY,
+ count=1,
+ bysetpos=(-1,0,1),
+ dtstart=parse("19970902T090000"))
class ParserTest(unittest.TestCase):