diff options
author | Ken Murchison <murch@fastmail.com> | 2021-03-17 11:51:24 -0400 |
---|---|---|
committer | Allen Winter <allen.winter@kdab.com> | 2021-04-11 14:29:05 -0400 |
commit | ba5c1c1c5c79ed497dd8d9f119b8b41c2c3fe918 (patch) | |
tree | b7393996e7cad50f31b62cbbde78718cc81b350f | |
parent | 22edb276eb3de494b0ca8050a9094d5cffffcd1a (diff) | |
download | libical-git-ba5c1c1c5c79ed497dd8d9f119b8b41c2c3fe918.tar.gz |
icaltz-util.c: check for trailing junk in TZ string
-rw-r--r-- | src/libical/icaltz-util.c | 59 |
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); + } } } } |