summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Murchison <murch@fastmail.com>2021-03-17 11:51:24 -0400
committerAllen Winter <allen.winter@kdab.com>2021-04-11 14:29:05 -0400
commitba5c1c1c5c79ed497dd8d9f119b8b41c2c3fe918 (patch)
treeb7393996e7cad50f31b62cbbde78718cc81b350f
parent22edb276eb3de494b0ca8050a9094d5cffffcd1a (diff)
downloadlibical-git-ba5c1c1c5c79ed497dd8d9f119b8b41c2c3fe918.tar.gz
icaltz-util.c: check for trailing junk in TZ string
-rw-r--r--src/libical/icaltz-util.c59
1 files changed, 35 insertions, 24 deletions
diff --git a/src/libical/icaltz-util.c b/src/libical/icaltz-util.c
index 72a6e209..88380e75 100644
--- a/src/libical/icaltz-util.c
+++ b/src/libical/icaltz-util.c
@@ -629,8 +629,7 @@ icalcomponent *icaltzutil_fetch_timezone(const char *location)
tzstr = NULL;
}
else {
- struct icaltimetype std_trans, dst_trans, last_trans;
- icalrecur_iterator *iter;
+ struct icaltimetype std_trans, dst_trans;
/* Parse std->dst rule */
p = parse_posix_rule(++p /* skip ',' */,
@@ -640,30 +639,42 @@ icalcomponent *icaltzutil_fetch_timezone(const char *location)
p = parse_posix_rule(++p /* skip ',' */,
&standard.final_recur, &std_trans);
- last_trans = icaltime_from_timet_with_zone(transitions[num_trans-1], 0, NULL);
- if (types[trans_idx[num_trans-1]].isdst) {
- /* Add next dst->std transition */
- std_trans.year = last_trans.year;
- std_trans.month = last_trans.month;
- std_trans.day = last_trans.day;
- iter = icalrecur_iterator_new(standard.final_recur, std_trans);
- std_trans = icalrecur_iterator_next(iter);
- icaltime_adjust(&std_trans, 0, 0, 0, -dst_type->gmtoff);
- transitions[num_trans] = icaltime_as_timet(std_trans);
- trans_idx[num_trans++] = (int) num_types-2;
- icalrecur_iterator_free(iter);
+ if (*p != '\n') {
+ /* Trailing junk, so ignore the TZ string */
+ tzstr = NULL;
}
else {
- /* Add next std->dst transition */
- dst_trans.year = last_trans.year;
- dst_trans.month = last_trans.month;
- dst_trans.day = last_trans.day;
- iter = icalrecur_iterator_new(daylight.final_recur, dst_trans);
- dst_trans = icalrecur_iterator_next(iter);
- icaltime_adjust(&dst_trans, 0, 0, 0, -std_type->gmtoff);
- transitions[num_trans] = icaltime_as_timet(dst_trans);
- trans_idx[num_trans++] = (int) num_types-1;
- icalrecur_iterator_free(iter);
+ struct icaltimetype last_trans =
+ icaltime_from_timet_with_zone(transitions[num_trans-1],
+ 0, NULL);
+ icalrecur_iterator *iter;
+
+ if (types[trans_idx[num_trans-1]].isdst) {
+ /* Add next dst->std transition */
+ std_trans.year = last_trans.year;
+ std_trans.month = last_trans.month;
+ std_trans.day = last_trans.day;
+ iter = icalrecur_iterator_new(standard.final_recur,
+ std_trans);
+ std_trans = icalrecur_iterator_next(iter);
+ icaltime_adjust(&std_trans, 0, 0, 0, -dst_type->gmtoff);
+ transitions[num_trans] = icaltime_as_timet(std_trans);
+ trans_idx[num_trans++] = (int) num_types-2;
+ icalrecur_iterator_free(iter);
+ }
+ else {
+ /* Add next std->dst transition */
+ dst_trans.year = last_trans.year;
+ dst_trans.month = last_trans.month;
+ dst_trans.day = last_trans.day;
+ iter = icalrecur_iterator_new(daylight.final_recur,
+ dst_trans);
+ dst_trans = icalrecur_iterator_next(iter);
+ icaltime_adjust(&dst_trans, 0, 0, 0, -std_type->gmtoff);
+ transitions[num_trans] = icaltime_as_timet(dst_trans);
+ trans_idx[num_trans++] = (int) num_types-1;
+ icalrecur_iterator_free(iter);
+ }
}
}
}