[PATCH] Incorrect decode from 64bit tzfile
Allen Winter
winter at kde.org
Tue Mar 9 19:03:15 GMT 2021
On Tuesday, March 9, 2021 1:01:53 PM EST Milan Crha wrote:
> Hello,
> I've been looking onto a downstream bug
> https://gitlab.gnome.org/GNOME/evolution/-/issues/1381
> which exhibits as showing incorrect UTC offset for Asia/Kolkata time
> zone.
>
> Diving into the code the problem is that the times returned from
>
> $ zdump Asia/Kolkata -i
>
> are like this:
>
> TZ="Asia/Kolkata"
> - - +055328 LMT
> 1854-06-27 23:59:52 +055320 HMT
> 1869-12-31 23:27:50 +052110 MMT
> 1906-01-01 00:08:50 +0530 IST
> 1941-10-01 01 +0630 1
> 1942-05-14 23 +0530 IST
> 1942-09-01 01 +0630 1
> 1945-10-14 23 +0530 IST
>
> thus back in 1854 / 1869. The later, when truncated, is 2006, which
> causes the wrong UTC offset, due to the code picking this change as the
> nearest, even though the corresponding RRULE has set UNTIL (but this
> information is not propagated in the 'changes' array).
>
> I realized there's only a type cast error for little endian when
> decoding 64bit values from the tzfile, which is easy to fix (and hard
> to find). See the attached patch.
>
> Checking what libical does now, it misses the 1854 transition, it
> starts from 1869. It makes sense, because the num_trans are processed
> from 1, not from 0. Starting from 0 does not help much, also because
> there's missing the starting offset, thus I did not include it in this
> patch.
>
> This change does not fix an issue with reading tzfile in the slim
> format, even I do not see much difference in the fat and slim formats
> regarding the values read from it by the libical. It's still to be
> investigated what fails there.
>
> Good news is that before the patch the 'timezones' test returns:
> *** Summary: 425 zones tested, 2920 days failed, 152205 okay => 1% failed ***
> while after the patch it returns:
> *** Summary: 425 zones tested, 1825 days failed, 153300 okay => 1% failed ***
> thus there is an improvement.
>
> Of course, the right thing would be to have 0 failed days there.
> Bye,
> Milan
>
>
Grrr. how could we have missed this?
all the other return statements in decode64() cast to (const long long int) already.
oh well.
I wonder if the Mac timezones test will behave better now. I'll test that.
Thanks Milan.
More information about the libical-devel
mailing list