Index: src/libical/icalrecur.c =================================================================== --- src/libical/icalrecur.c (revision 936) +++ src/libical/icalrecur.c (working copy) @@ -875,26 +875,18 @@ icalrecur_two_byrule(impl,BY_YEAR_DAY,BY_DAY) ){ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - + free(impl); return 0; } - /* BYWEEKNO and BYMONTH rule parts may not both appear.*/ + - if(icalrecur_two_byrule(impl,BY_WEEK_NO,BY_MONTH)){ - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return 0; - } - /* BYWEEKNO and BYMONTHDAY rule parts may not both appear.*/ if(icalrecur_two_byrule(impl,BY_WEEK_NO,BY_MONTH_DAY)){ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - - icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return 0; + free(impl); + return 0; } @@ -904,7 +896,8 @@ if(freq == ICAL_MONTHLY_RECURRENCE && icalrecur_one_byrule(impl,BY_WEEK_NO)){ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return 0; + free(impl); + return 0; } @@ -914,13 +907,15 @@ if(freq == ICAL_WEEKLY_RECURRENCE && icalrecur_one_byrule(impl,BY_MONTH_DAY )) { icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return 0; + free(impl); + return 0; } /* BYYEARDAY may only appear in YEARLY rules */ if(freq != ICAL_YEARLY_RECURRENCE && icalrecur_one_byrule(impl,BY_YEAR_DAY )) { icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); + free(impl); return 0; } @@ -993,6 +988,11 @@ for (;;) { expand_year_days(impl, impl->last.year); + if( icalerrno != ICAL_NO_ERROR) { + icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); + free(impl); + return 0; + } if (impl->days[0] != ICAL_RECURRENCE_ARRAY_MAX) break; /* break when no days are expanded */ increment_year(impl,impl->rule.interval); @@ -1054,7 +1054,8 @@ if(impl->last.day > days_in_month || impl->last.day == 0){ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); - return 0; + free(impl); + return 0; } } else if (has_by_data(impl,BY_MONTH_DAY)) { @@ -1885,7 +1886,7 @@ static int expand_year_days(icalrecur_iterator* impl, int year) { - int j,k; + int i,j,k; int days_index=0; struct icaltimetype t; int flags; @@ -1907,6 +1908,46 @@ (HBD(BY_YEAR_DAY) ? 1<by_ptrs[BY_MONTH][j]!=ICAL_RECURRENCE_ARRAY_MAX; j++){ + int month = impl->by_ptrs[BY_MONTH][j]; + int first_week, last_week; + t.month = month; + t.day = 1; + first_week = icaltime_week_number(t); + t.day = icaltime_days_in_month(month,year); + last_week = icaltime_week_number(t); + for(j=first_week; j