Skip to content

Attempted to multiply with overflow in chinese calendar construction code #7049

@Manishearth

Description

@Manishearth

I haven't even finished writing this fuzzer and I found a bug

	FuzzInput {
	    year: 889192448,
	    month: 0,
	    day: 0,
	    month_interpretation: Ordinal,
	    overflow_constrain: false,
	    cal: Dangi,
	}

thread '<unnamed>' (1026981) panicked at components/calendar/src/cal/chinese/simple.rs:93:32:
attempt to multiply with overflow
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
==1026981== ERROR: libFuzzer: deadly signal

Currently this just sets year and day, ignoring month entirely. I could clean this up into a proper testcase but i'd like to actually finished the fuzzer.

Fuzzer code:

#[derive(Arbitrary, Debug)]
struct FuzzInput {
    year: i32,
    month: u8,
    day: u8,
    month_interpretation: MonthInterpretation,
    overflow_constrain: bool,
    cal: AnyCalendarKind,
}

#[derive(Arbitrary, Debug)]
enum MonthInterpretation {
    Ordinal,
    CodeNormal,
    CodeLeap,
}

#[derive(Arbitrary, Debug)]
pub enum AnyCalendarKind {
    Buddhist,
    Chinese,
    Coptic,
    Dangi,
    Ethiopian,
    EthiopianAmeteAlem,
    Gregorian,
    Hebrew,
    Indian,
    HijriTabularTypeIIFriday,
    HijriSimulatedMecca,
    HijriTabularTypeIIThursday,
    HijriUmmAlQura,
    Iso,
    Japanese,
    JapaneseExtended,
    Persian,
    Roc,
}

impl From<AnyCalendarKind> for icu_calendar::AnyCalendarKind {
    fn from(other: AnyCalendarKind) -> Self {
        match other {
            AnyCalendarKind::Buddhist => Self::Buddhist,
            AnyCalendarKind::Chinese => Self::Chinese,
            AnyCalendarKind::Coptic => Self::Coptic,
            AnyCalendarKind::Dangi => Self::Dangi,
            AnyCalendarKind::Ethiopian => Self::Ethiopian,
            AnyCalendarKind::EthiopianAmeteAlem => Self::EthiopianAmeteAlem,
            AnyCalendarKind::Gregorian => Self::Gregorian,
            AnyCalendarKind::Hebrew => Self::Hebrew,
            AnyCalendarKind::Indian => Self::Indian,
            AnyCalendarKind::HijriTabularTypeIIFriday => Self::HijriTabularTypeIIFriday,
            AnyCalendarKind::HijriSimulatedMecca => Self::HijriSimulatedMecca,
            AnyCalendarKind::HijriTabularTypeIIThursday => Self::HijriTabularTypeIIThursday,
            AnyCalendarKind::HijriUmmAlQura => Self::HijriUmmAlQura,
            AnyCalendarKind::Iso => Self::Iso,
            AnyCalendarKind::Japanese => Self::Japanese,
            AnyCalendarKind::JapaneseExtended => Self::JapaneseExtended,
            AnyCalendarKind::Persian => Self::Persian,
            AnyCalendarKind::Roc => Self::Roc,
        }
    }
}

fuzz_target!(|data: FuzzInput| {
    let calendar = AnyCalendar::new(data.cal.into());

    let mut options = DateFromFieldsOptions::default();

    options.overflow = if data.overflow_constrain {
        Some(Overflow::Constrain)
    } else {
        Some(Overflow::Reject)
    };

    let mut fields = DateFields::default();
    fields.extended_year = Some(data.year);
    fields.day = NonZeroU8::new(data.day);
    let date = Date::try_from_fields(fields, options, calendar);
});

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-calendarComponent: Calendars

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions