@@ -1797,6 +1797,14 @@ static enum ical_frequency parse_freq(const char *s)
17971797 else return ical_frequency::invalid;
17981798}
17991799
1800+ static long clamp_low_n (const char *s, long def)
1801+ {
1802+ if (s == nullptr )
1803+ return def;
1804+ auto v = strtol (s, nullptr , 0 );
1805+ return v > 0 ? v : INT_MIN;
1806+ }
1807+
18001808/*
18011809 * @ptz_component: if NULL, represents UTC
18021810 *
@@ -1811,23 +1819,12 @@ const char *ical_parse_rrule(const ical_component *ptz_component,
18111819 if (pirrule->frequency == ical_frequency::invalid)
18121820 return " E-2825" ;
18131821 pirrule->real_frequency = pirrule->frequency ;
1814- auto pvalue = ical_get_first_subvalue_by_name_internal (pvalue_list, " INTERVAL" );
1815- if (NULL == pvalue) {
1816- pirrule->interval = 1 ;
1817- } else {
1818- pirrule->interval = strtol (pvalue, nullptr , 0 );
1819- if (pirrule->interval <= 0 )
1820- return " E-2826: RRULE has invalid INTERVAL" ;
1821- }
1822- pvalue = ical_get_first_subvalue_by_name_internal (pvalue_list, " COUNT" );
1823- if (NULL == pvalue) {
1824- pirrule->total_count = 0 ;
1825- } else {
1826- pirrule->total_count = strtol (pvalue, nullptr , 0 );
1827- if (pirrule->total_count <= 0 )
1828- return " E-2827: RRULE has invalid COUNT" ;
1829- }
1830- pvalue = ical_get_first_subvalue_by_name_internal (pvalue_list, " UNTIL" );
1822+ pirrule->interval = clamp_low_n (ical_get_first_subvalue_by_name_internal (pvalue_list, " INTERVAL" ), 1 );
1823+ pirrule->total_count = clamp_low_n (ical_get_first_subvalue_by_name_internal (pvalue_list, " COUNT" ), 0 );
1824+ if (pirrule->interval == INT_MIN || pirrule->total_count == INT_MIN)
1825+ return " E-2826" ;
1826+
1827+ auto pvalue = ical_get_first_subvalue_by_name_internal (pvalue_list, " UNTIL" );
18311828 if (NULL != pvalue) {
18321829 if (pirrule->total_count != 0 )
18331830 return " E-2828: Cannot combine COUNT with UNTIL in RRULE" ;
0 commit comments