Skip to content

Commit cd10848

Browse files
committed
email_lib: extract INTERVAL/COUNT string parse from ical_parse_rrule into separate function
1 parent 1fdfa3f commit cd10848

File tree

1 file changed

+14
-17
lines changed

1 file changed

+14
-17
lines changed

lib/email/ical.cpp

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)