From b4f9d2179fa6683b38247c068f0e0e1b04ef34889ebf1accdbf50f3c8f59e3f9 Mon Sep 17 00:00:00 2001 From: Dirk Mueller Date: Thu, 26 Nov 2020 10:02:22 +0000 Subject: [PATCH] Accepting request 849149 from home:mgorse:branches:devel:libraries:c_c++ - Add libical-read-v2-v3-data.patch: correctly read slim timezone data (bsc#1178412). OBS-URL: https://build.opensuse.org/request/show/849149 OBS-URL: https://build.opensuse.org/package/show/devel:libraries:c_c++/libical?expand=0&rev=70 --- libical-read-v2-v3-data.patch | 193 ++++++++++++++++++++++++++++++++++ libical.changes | 6 ++ libical.spec | 1 + 3 files changed, 200 insertions(+) create mode 100644 libical-read-v2-v3-data.patch diff --git a/libical-read-v2-v3-data.patch b/libical-read-v2-v3-data.patch new file mode 100644 index 0000000..fa35881 --- /dev/null +++ b/libical-read-v2-v3-data.patch @@ -0,0 +1,193 @@ +From c7e767bfe1d218aaf845686f9811195cecc7be2a Mon Sep 17 00:00:00 2001 +From: Ken Murchison +Date: Wed, 11 Nov 2020 08:50:54 -0500 +Subject: [PATCH] icaltzutil_fetch_timezone() should read v2/v3 data when + available + +--- + src/libical/icaltz-util.c | 103 +++++++++++++++++++++++++++++++------- + 1 file changed, 86 insertions(+), 17 deletions(-) + +diff --git a/src/libical/icaltz-util.c b/src/libical/icaltz-util.c +index 710ff9db..c2663e93 100644 +--- a/src/libical/icaltz-util.c ++++ b/src/libical/icaltz-util.c +@@ -84,6 +84,9 @@ + + typedef struct + { ++ char magic[4]; ++ char version; ++ char unused[15]; + char ttisgmtcnt[4]; + char ttisstdcnt[4]; + char leapcnt[4]; +@@ -153,6 +156,23 @@ static int decode(const void *ptr) + } + } + ++static long long int decode64(const void *ptr) ++{ ++#if defined(sun) && defined(__SVR4) ++#if defined(_BIG_ENDIAN) ++ return *(const long long int *)ptr; ++#else ++ return BSWAP_64(*(const long long int *)ptr); ++#endif ++#else ++ if ((BYTE_ORDER == BIG_ENDIAN)) { ++ return *(const long long int *)ptr; ++ } else { ++ return (int)bswap_64(*(const long long int *)ptr); ++ } ++#endif ++} ++ + static char *zname_from_stridx(char *str, size_t idx) + { + size_t i; +@@ -239,12 +259,13 @@ static void adjust_dtstart_day_to_rrule(icalcomponent *comp, struct icalrecurren + + icalcomponent *icaltzutil_fetch_timezone(const char *location) + { +- tzinfo type_cnts; ++ tzinfo header; + size_t i, num_trans, num_chars, num_leaps, num_isstd, num_isgmt; + size_t num_types = 0; + size_t size; + int pos, sign; + time_t now = time(NULL); ++ int trans_size = 4; + + const char *zonedir; + FILE *f = NULL; +@@ -296,27 +317,65 @@ icalcomponent *icaltzutil_fetch_timezone(const char *location) + goto error; + } + +- if (fseek(f, 20, SEEK_SET) != 0) { +- icalerror_set_errno(ICAL_FILE_ERROR); ++ /* read version 1 header */ ++ EFREAD(&header, 44, 1, f); ++ if (memcmp(header.magic, "TZif", 4)) { ++ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); ++ goto error; ++ } ++ switch (header.version) { ++ case 0: ++ break; ++ case '2': ++ case '3': ++ if (sizeof(time_t) == 8) ++ trans_size = 8; ++ break; ++ default: ++ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); + goto error; + } + +- EFREAD(&type_cnts, 24, 1, f); ++ num_isgmt = (size_t)decode(header.ttisgmtcnt); ++ num_leaps = (size_t)decode(header.leapcnt); ++ num_chars = (size_t)decode(header.charcnt); ++ num_trans = (size_t)decode(header.timecnt); ++ num_isstd = (size_t)decode(header.ttisstdcnt); ++ num_types = (size_t)decode(header.typecnt); ++ ++ if (trans_size == 8) { ++ long skip = num_trans * 5 + num_types * 6 + ++ num_chars + num_leaps * 8 + num_isstd + num_isgmt; ++ ++ /* skip version 1 data block */ ++ if (fseek(f, skip, SEEK_CUR) != 0) { ++ icalerror_set_errno(ICAL_FILE_ERROR); ++ goto error; ++ } + +- num_isgmt = (size_t)decode(type_cnts.ttisgmtcnt); +- num_leaps = (size_t)decode(type_cnts.leapcnt); +- num_chars = (size_t)decode(type_cnts.charcnt); +- num_trans = (size_t)decode(type_cnts.timecnt); +- num_isstd = (size_t)decode(type_cnts.ttisstdcnt); +- num_types = (size_t)decode(type_cnts.typecnt); ++ /* read version 2+ header */ ++ EFREAD(&header, 44, 1, f); ++ if (memcmp(header.magic, "TZif", 4)) { ++ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); ++ goto error; ++ } + ++ num_isgmt = (size_t)decode(header.ttisgmtcnt); ++ num_leaps = (size_t)decode(header.leapcnt); ++ num_chars = (size_t)decode(header.charcnt); ++ num_trans = (size_t)decode(header.timecnt); ++ num_isstd = (size_t)decode(header.ttisstdcnt); ++ num_types = (size_t)decode(header.typecnt); ++ } ++ ++ /* read data block */ + if (num_trans > 0) { + transitions = calloc(num_trans, sizeof(time_t)); + if (transitions == NULL) { + icalerror_set_errno(ICAL_NEWFAILED_ERROR); + goto error; + } +- r_trans = calloc(num_trans, 4); ++ r_trans = calloc(num_trans, trans_size); + if (r_trans == NULL) { + icalerror_set_errno(ICAL_NEWFAILED_ERROR); + goto error; +@@ -325,7 +384,7 @@ icalcomponent *icaltzutil_fetch_timezone(const char *location) + icalerror_set_errno(ICAL_FILE_ERROR); + goto error; + } +- EFREAD(r_trans, 4, num_trans, f); ++ EFREAD(r_trans, trans_size, num_trans, f); + temp = r_trans; + if (num_trans) { + trans_idx = calloc(num_trans, sizeof(int)); +@@ -335,8 +394,11 @@ icalcomponent *icaltzutil_fetch_timezone(const char *location) + } + for (i = 0; i < num_trans; i++) { + trans_idx[i] = fgetc(f); +- transitions[i] = (time_t) decode(r_trans); +- r_trans += 4; ++ if (trans_size == 8) ++ transitions[i] = (time_t) decode64(r_trans); ++ else ++ transitions[i] = (time_t) decode(r_trans); ++ r_trans += trans_size; + } + } + r_trans = temp; +@@ -375,10 +437,13 @@ icalcomponent *icaltzutil_fetch_timezone(const char *location) + goto error; + } + for (i = 0; i < num_leaps; i++) { +- char c[4]; ++ char c[8]; + +- EFREAD(c, 4, 1, f); +- leaps[i].transition = (time_t)decode(c); ++ EFREAD(c, trans_size, 1, f); ++ if (trans_size == 8) ++ leaps[i].transition = (time_t)decode64(c); ++ else ++ leaps[i].transition = (time_t)decode(c); + + EFREAD(c, 4, 1, f); + leaps[i].change = decode(c); +@@ -403,6 +468,10 @@ icalcomponent *icaltzutil_fetch_timezone(const char *location) + types[i++].isgmt = 0; + } + ++ if (trans_size == 8) { ++ /* XXX Do we need/want to read and use the footer? */ ++ } ++ + /* Read all the contents now */ + + for (i = 0; i < num_types; i++) { +-- +2.29.2 + diff --git a/libical.changes b/libical.changes index 1906f3d..6d0af6c 100644 --- a/libical.changes +++ b/libical.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Tue Nov 17 18:49:00 UTC 2020 - Michael Gorse + +- Add libical-read-v2-v3-data.patch: correctly read slim timezone + data (bsc#1178412). + ------------------------------------------------------------------- Sat Apr 11 19:46:49 UTC 2020 - Bjørn Lie diff --git a/libical.spec b/libical.spec index 369e2bb..c255347 100644 --- a/libical.spec +++ b/libical.spec @@ -48,6 +48,7 @@ Patch2: 0002-vcc.y-fix-infinite-loop-with-lower-case-hex-digits.patch Patch3: 0003-vcc.y-fix-infinite-loop-with-non-hex-digits.patch Patch4: 0004-vobject.c-vCard-Unicode-reading-support.patch Patch5: 0005-vcc.y-do-not-ignore-field-separator-in-QUOTED-PRINTA.patch +Patch6: libical-read-v2-v3-data.patch BuildRequires: c++_compiler BuildRequires: cmake >= 3.1