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):