From 59f4c9e6cbfae58fc7cd62a3dcb5d8a3c242c10c Mon Sep 17 00:00:00 2001 From: Ken Murchison Date: Wed, 24 Sep 2014 09:22:11 -0400 Subject: icalrecur.c: properly skip bogus dates (e.g. 2/29) in RRULE:FREQ=YEARLY[;BYMONTH][;BYMONTHDAY] --- src/libical/icalrecur.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/libical/icalrecur.c b/src/libical/icalrecur.c index 4af68e46..9510ac82 100644 --- a/src/libical/icalrecur.c +++ b/src/libical/icalrecur.c @@ -1955,6 +1955,8 @@ static int iso_week_number(icalrecur_iterator* impl, struct icaltimetype tt) return week; } +#define is_bogus_date(tt) (tt.day > icaltime_days_in_month(tt.month, tt.year)) + /* For INTERVAL=YEARLY, set up the days[] array in the iterator to list all of the days of the current year that are specified in this @@ -2031,7 +2033,9 @@ static int expand_year_days(icalrecur_iterator* impl, int year) t = impl->dtstart; t.year = impl->last.year; - impl->days[days_index++] = (short)icaltime_day_of_year(t); + if (!is_bogus_date(t)) { + impl->days[days_index++] = (short)icaltime_day_of_year(t); + } break; } @@ -2047,10 +2051,11 @@ static int expand_year_days(icalrecur_iterator* impl, int year) t.month = month; t.is_date = 1; - doy = icaltime_day_of_year(t); + if (!is_bogus_date(t)) { + doy = icaltime_day_of_year(t); - impl->days[days_index++] = (short)doy; - + impl->days[days_index++] = (short)doy; + } } break; } @@ -2067,10 +2072,11 @@ static int expand_year_days(icalrecur_iterator* impl, int year) t.year = year; t.is_date = 1; - doy = icaltime_day_of_year(t); - - impl->days[days_index++] = (short)doy; + if (!is_bogus_date(t)) { + doy = icaltime_day_of_year(t); + impl->days[days_index++] = (short)doy; + } } break; } @@ -2090,10 +2096,11 @@ static int expand_year_days(icalrecur_iterator* impl, int year) t.year = year; t.is_date = 1; - doy = icaltime_day_of_year(t); - - impl->days[days_index++] = (short)doy; + if (!is_bogus_date(t)) { + doy = icaltime_day_of_year(t); + impl->days[days_index++] = (short)doy; + } } } -- cgit v1.2.1