summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Murchison <murch@fastmail.com>2019-05-26 10:24:18 -0400
committerKen Murchison <murch@fastmail.com>2019-05-26 10:24:18 -0400
commit5eb8e14b2a0f9ecedb08ec84bb0a8d5aa394e1fb (patch)
tree3a23a14496d0e4b992c73da4e1ad0d1c7d2410a7
parentafa976ad016f60b41df6957dce55649e88647ee7 (diff)
downloadlibical-git-5eb8e14b2a0f9ecedb08ec84bb0a8d5aa394e1fb.tar.gz
Don't allow both COUNT and UNTIL in RRULE
-rw-r--r--src/libical/icalderivedvalue.c.in3
-rw-r--r--src/libical/icalrecur.c6
2 files changed, 8 insertions, 1 deletions
diff --git a/src/libical/icalderivedvalue.c.in b/src/libical/icalderivedvalue.c.in
index a8d4adef..140b267e 100644
--- a/src/libical/icalderivedvalue.c.in
+++ b/src/libical/icalderivedvalue.c.in
@@ -144,6 +144,9 @@ icalvalue *icalvalue_new_recur(struct icalrecurrencetype v)
void icalvalue_set_recur(icalvalue *impl, struct icalrecurrencetype v)
{
icalerror_check_arg_rv((impl != 0), "value");
+ /* don't allow both count and until */
+ icalerror_check_arg_rv(v.count == 0 || icaltime_is_null_time(v.until),
+ "recurrencetype");
icalerror_check_value_type(value, ICAL_RECUR_VALUE);
if (impl->data.v_recur != 0) {
diff --git a/src/libical/icalrecur.c b/src/libical/icalrecur.c
index afacedad..0b3c63c9 100644
--- a/src/libical/icalrecur.c
+++ b/src/libical/icalrecur.c
@@ -611,9 +611,13 @@ struct icalrecurrencetype icalrecurrencetype_from_string(const char *str)
parser.rt.count = atoi(value);
/* don't allow count to be less than 1 */
if (parser.rt.count < 1) r = -1;
+ /* don't allow both count and until */
+ else if (!icaltime_is_null_time(parser.rt.until)) r = -1;
} else if (strcasecmp(name, "UNTIL") == 0) {
parser.rt.until = icaltime_from_string(value);
if (icaltime_is_null_time(parser.rt.until)) r = -1;
+ /* don't allow both count and until */
+ else if (parser.rt.count > 0) r = -1;
} else if (strcasecmp(name, "INTERVAL") == 0) {
parser.rt.interval = (short)atoi(value);
/* don't allow an interval to be less than 1
@@ -720,7 +724,7 @@ char *icalrecurrencetype_as_string_r(struct icalrecurrencetype *recur)
char temp[20];
int i, j;
- if (recur->freq == ICAL_NO_RECURRENCE) {
+ if (recur == 0 || recur->freq == ICAL_NO_RECURRENCE) {
return 0;
}