kopia lustrzana https://github.com/collective/icalendar
Merge branch 'feat/oss-fuzz-integration'
commit
484f9930d6
|
@ -358,6 +358,10 @@ class Component(CaselessDict):
|
|||
elif uname == 'END':
|
||||
# we are done adding properties to this component
|
||||
# so pop it from the stack and add it to the new top.
|
||||
if not stack:
|
||||
# The stack is currently empty, the input must be invalid
|
||||
raise ValueError('END encountered without an accompanying BEGIN!')
|
||||
|
||||
component = stack.pop()
|
||||
if not stack: # we are at the end
|
||||
comps.append(component)
|
||||
|
|
|
@ -17,16 +17,24 @@
|
|||
import atheris
|
||||
import sys
|
||||
|
||||
with atheris.instrument_imports(include=['icalendar']):
|
||||
from icalendar import Calendar
|
||||
with atheris.instrument_imports(
|
||||
include=['icalendar'],
|
||||
exclude=['pytz', 'six', 'site_packages', 'pkg_resources', 'dateutil']):
|
||||
import icalendar
|
||||
|
||||
_value_error_matches = [
|
||||
"component", "parse", "Expected", "Wrong date format", "END encountered",
|
||||
"vDDD", 'recurrence', 'Wrong datetime', 'Offset must', 'Invalid iCalendar'
|
||||
]
|
||||
|
||||
|
||||
@atheris.instrument_func
|
||||
def TestOneInput(data):
|
||||
fdp = atheris.FuzzedDataProvider(data)
|
||||
try:
|
||||
b = fdp.ConsumeBool()
|
||||
|
||||
cal = Calendar.from_ical(fdp.ConsumeString(fdp.remaining_bytes()))
|
||||
cal = icalendar.Calendar.from_ical(fdp.ConsumeString(fdp.remaining_bytes()))
|
||||
|
||||
if b:
|
||||
for event in cal.walk('VEVENT'):
|
||||
|
@ -34,10 +42,11 @@ def TestOneInput(data):
|
|||
else:
|
||||
cal.to_ical()
|
||||
except ValueError as e:
|
||||
if "component" in str(e) or "parse" in str(e) or "Expected" in str(e):
|
||||
if any(m in str(e) for m in _value_error_matches):
|
||||
return -1
|
||||
raise e
|
||||
|
||||
|
||||
def main():
|
||||
atheris.Setup(sys.argv, TestOneInput)
|
||||
atheris.Fuzz()
|
||||
|
|
|
@ -250,8 +250,19 @@ class vDDDLists:
|
|||
self.dts = vDDD
|
||||
|
||||
def to_ical(self):
|
||||
dts_ical = (dt.to_ical() for dt in self.dts)
|
||||
return b",".join(dts_ical)
|
||||
dts_ical = [dt.to_ical() for dt in self.dts]
|
||||
|
||||
# Make sure all elements are of the same type
|
||||
if dts_ical and all(type(dt) is type(dts_ical[0]) for dt in dts_ical):
|
||||
first_dt = dts_ical[0]
|
||||
if isinstance(first_dt, bytes):
|
||||
return b",".join(dts_ical)
|
||||
elif isinstance(first_dt, str):
|
||||
return ",".join(dts_ical)
|
||||
else:
|
||||
raise ValueError(f"Unexpected type {type(first_dt)} in vDDD list!")
|
||||
else:
|
||||
raise ValueError("Type mismatch in vDDD list!")
|
||||
|
||||
@staticmethod
|
||||
def from_ical(ical, timezone=None):
|
||||
|
|
Ładowanie…
Reference in New Issue