The 2025c release of the tz code and data is available. This release mostly changes code and commentary. The only changed data are leap second table expiration and pre-1976 time in Baja California. This release contains the following changes: Briefly: Several code changes for compatibility with FreeBSD. Changes to past timestamps Baja California agreed with California’s DST rules in 1953 and in 1961 through 1975, instead of observing standard time all year. (Thanks to Alois Treindl.) Changes to build procedure Files in distributed tarballs now have correct commit times. Formerly, the committer’s time zone was incorrectly ignored. Distribution products (*.asc, *.gz, and *.lz) now have reproducible timestamps. Formerly, only the contents of the compressed tarballs had reproducible timestamps. By default, distributed formatted man pages (*.txt) now use UTF-8 and are left-adjusted more consistently. A new Makefile macro MANFLAGS can override these defaults. (Thanks to G. Branden Robinson for inspiring these changes.) Changes to code An unset TZ is no longer invalid when /etc/localtime is missing, and is abbreviated "UTC" not "-00". This reverts to 2024b behavior. (Problem and patch reported by Dag-Erling Smørgrav.) New function offtime_r, short for fixed-offset localtime_rz. It is defined if STD_INSPIRED is defined. (Patch from Dag-Erling Smørgrav.) tzset etc. are now more cautious about questionable TZ settings. Privileged programs now reject TZ settings that start with '/', unless they are TZDEFAULT (default "/etc/localtime") or start with TZDIR then '/' (default "/usr/share/zoneinfo/"). Unprivileged programs now require files to be regular files and reject relative names containing ".." directory components; formerly, only privileged programs did those two things. These changes were inspired by similar behavior in FreeBSD. On NetBSD, unprivileged programs now use O_REGULAR to check whether a TZ setting starting with '/' names a regular file, avoiding a minor security race still present elsewhere. TZ strings taken from tzalloc arguments are now treated with no less caution than TZ strings taken from the environment, as the old undocumented behavior would have been hard to explain. tzset etc. no longer use the ‘access’ system call to check access; instead they now use the system calls issetugid, getauxval, getresuid/getresgid, and geteuid/getegid/getuid/getgid (whichever first works) to test whether a program is privileged. Compile with -DHAVE_SYS_AUXV_H=[01] to enable or disable <sys/auxv.h> which (if it defines AT_SECURE) enables getauxval, and compile with -DHAVE_ISSETUGID=[01], -DHAVE_GETRESUID=[01], and -DHAVE_GETEUID=[01] to enable or disable the other calls’ use. The new CFLAGS option -DTZ_CHANGE_INTERVAL=N makes tzset etc. check for TZif file changes if the in-memory data are N seconds old or more, and are derived from the TZ environment variable. This is intended for platforms that want tzset etc. to reflect changes to whatever file TZ selects (including changes to /etc/localtime if TZ is unset). If N is negative (the default) these checks are omitted; this is the traditional behavior. The new CFLAGS options -DHAVE_STRUCT_STAT_ST_CTIM=0 and -DHAVE_STRUCT_TIMESPEC=0 port to non-POSIX.1-2008 platforms that lack st_ctim and struct timespec, respectively. tzset etc. now treat ' ' like '_' in time zone abbreviations, just as they treat other invalid bytes. This continues the transition begun in release 96k, which removed spaces in tzdata because the spaces break time string parsers. The new CFLAGS option -DTHREAD_PREFER_SINGLE causes tzcode in single-threaded processes to avoid locks, as FreeBSD does. This can save time in single-threaded apps. The threadedness testing costs CPU time and energy in multi-threaded apps. New options -DHAVE___ISTHREADED and -DHAVE_SYS_SINGLE_THREADED_H can help configure how to test for single-threadedness. The new CFLAGS option -DTHREAD_RWLOCK uses read-write locks, as macOS does, instead of mutexes. This saves real time when TZ is rarely changing and many threads call tzcode simultaneously. It costs more CPU time and energy. The new CFLAGS option -TTHREAD_TM_MULTI causes localtime to return a pointer to thread-specific memory, as FreeBSD does, instead of to the same memory in all threads. This supports unportable programs that incorrectly use localtime instead of localtime_r. This option affects gmtime and offtime similarly to localtime. Because the corresponding storage is freed on thread exit, this option is incompatible with POSIX.1-2024 and earlier. It also costs CPU time and memory. tzfree now preserves errno, consistently with POSIX.1-2024 ‘free’. tzcode now uses mempcpy if available, guessing its availability. Compile with -DHAVE_MEMPCPY=1 or 0 to override the guess. tzcode now uses strnlen to improve asymptotic performance a bit. Compile with -DHAVE_STRNLEN=0 if your platform lacks it. tzcode now hand-declares unistd.h-provided symbols like getopt if HAVE_UNISTD_H=0, not if HAVE_POSIX_DECLS=0. tzset etc. now have an experimental OPENAT_TZDIR option; see Makefile and localtime.c for details. On platforms like GNU/Hurd that do not define PATH_MAX, exceedingly long TZ strings no longer fail merely because they exceed an arbitrary file name length limit imposed by tzcode. zic has new options inspired by FreeBSD. ‘-D’ skips creation of output ancestor directories, ‘-m MODE’ sets output files’ mode, and ‘-u OWNER[:GROUP]’ sets output files’ owner and group. zic now uses the fdopen function, which was standardized by POSIX.1-1988 and is now safe to use in portable code. This replaces its use of the older umask function, which complicated maintenance. Changes to commentary The leapseconds file contains commentary about the IERS and NIST last-modified and expiration timestamps for leap second data. (Thanks to Judah Levine.) Commentary now also uses characters from the set –‘’“”•≤ as this can be useful and should work with current applications. This also affects data in iso3166.tab and zone1970.tab, which now contain strings like “Côte d’Ivoire” instead of “Côte d'Ivoire”. Here are links to the release files: https://www.iana.org/time-zones/repository/releases/tzcode2025c.tar.gz https://www.iana.org/time-zones/repository/releases/tzdata2025c.tar.gz https://www.iana.org/time-zones/repository/releases/tzdb-2025c.tar.lz The following convenience links are also available, although they may point to the previous release until the relevant caches are refreshed: https://www.iana.org/time-zones/repository/tzcode-latest.tar.gz https://www.iana.org/time-zones/repository/tzdata-latest.tar.gz https://www.iana.org/time-zones/repository/tzdb-latest.tar.lz Links are also available via plain HTTP, and via FTP from ftp://ftp.iana.org/tz/releases with the same basenames as above. Each release file has a GPG signature, which can be retrieved by appending ".asc" to the above URLs. Copies of these signatures are appended to this message. This release corresponds to commit 7e1145bfdb9630c127841dc8ce808a937a300938 dated 2025-03-22 13:40:46 -0700 and tagged '2025c' in the development GitHub repository at <https://github.com/eggert/tz>. Here are the SHA-512 checksums for the release files: d14bc0680b9cb33d6526a2c0e483f2abafc2593cfe5fbfe7dcab940aafdc1baaec065dbaa1bb58b03586a8631ffdf43ebb22ff5a70503298b6ea2cf061d82c16 tzcode2025c.tar.gz 1e33f7212fd0ae2ad3c16e68f0c1fc7a6ad26a126b8406c379a5768d79604c6a816054bd0fe3a63228d70cd6a1fc2b1bae2a9f8014e102d3727eb9d21affa1f1 tzdata2025c.tar.gz 6fa233d6a884acd24b52c44b2eecf683f9403f44b39dcbe85b1ec92fc11f4daf6ee5143f05332faf9258b8bd8f7ca7d4882e19b1e3d892b4761be43fd4f39d51 tzdb-2025c.tar.lz Here are GPG digital signatures for the release files: -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEfjeSqdis99YzvBWI7ZfpDmKqfjQFAmk5+AQACgkQ7ZfpDmKq fjS7FQ/+OcQWOkAheWXB17w3dzqEaBTzzOFPoVWJkYDYYqRBFYcZHt6SL8NsJ6Vr 4PRv8UXvGZZhyamQY6CA3Te6/SRBTn4vKAPPYrwRxRENBHJtwf00H4khIqzL4iuu Lni7d3MyEurnQ99YKdCdsDM7V2GqGov8SFOIQWohAazL29n/396Me68Excr7WYh2 FY1qmbqQhBuh9WrQ9+YznWkKd5FcPj0a8+XBReABUR3yV58qZ4rvDhDpx+476U09 5PlOHgC3FdEII+I8ihKI+Y0FW20dDfyTc7Eechef2z3izlzaxSFbAXXQX1gs1Vj+ yhjp+MiJC9UiFP0VmafGdpuhNWafrRSF8uyhHEAPC2WRRSlz3hUBFchOWRBpgAkT yIhN7dUWPPT80Pu2vWn3Y647I8397b6mS5o8tLpgcU9S82phwY3zVtsXG4WjVVC/ RcNCyG0J2ybP+IA8r/jPdINLNm+lsdJKoU6Y19R+BJyAV1uycltUEx4yzxs8Mg/8 lxvg+JcKe94UhUHIQXo3j9lXg7KcFXCVjGBBBpfBn4FfcRmdA+IkgONF3MxWz86J 8jBJdSVi2/CjlteWVQ2pBKEEesjXjT0tX8dbVA2x4KAcWYT5jMMQxDEP+Q2uuKfj NhE4D99CiZwdYgi4JP4+86cTDArj9l17tWR9bmVXgyviFU4o3Go= =R12Y -----END PGP SIGNATURE----- -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEfjeSqdis99YzvBWI7ZfpDmKqfjQFAmk5+AUACgkQ7ZfpDmKq fjTtEg//VloILc1FvXSuFccnpY8G7rmCkL48q5628VbogfqLc3MSQ8FqlfBw3OkI LqiDAF22/nFcMhtQ9j61cFJ5GrAUF28MIKDl1ol5YEswQgiLxDxFbK2c5uWdYJed 4I5bqU8rs6RTA/5ZZ/MMDe7JIGEYClZhHzT9Hs9vLrg2aOW7vSzXjjuAy7FqUwpX k1m6KQtL6UPl4tkbDY9wLSifDtg6GqfZT9bYtPxxLKc89Mm0tFJP7aXuooELb0/k 1YsCFZDU7OK8ttgAlPbtAebfrFJbk1jKuBQqoqyH59QtA4OegHFjRVPFcHYevJsl FMhA10XEXS1C3T2KC9De9Xypt1aJIVIhtEHz7GjlubZRfgLGb+xAvTsJj2h20TIm mTAaJ9tBdr7TiVRlLdUgWdsLRwrVSOLbFCjL5Fa2+XpTNoowPmDp7YHmFsk+itDH 40fRFvBc842huCIsFbQ1EInjVpuUQqaMb1CmZlNMhJz6DoXEicOoo9iwqjRxZyVt 7NB4AQaqBwAKgvTw7iV4Iw0naWaKhwN9pP2AbnC5cMd3SRMneJ6Sxt4MtA9dqpFB mKIMF9Tlb+twuyOZXezaD/RqJs19gusdFmVlpJbNzez//pYMJ/9LcjB+xz61c5Zf mIPWE0mkzSRvhqca4L3inlC73aTRDp2OEt9+n+AJPnk27BRe5Xs= =1kyi -----END PGP SIGNATURE----- -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEfjeSqdis99YzvBWI7ZfpDmKqfjQFAmk5+AYACgkQ7ZfpDmKq fjRXzA/9GHRwVUZRXXmlwgpPZDVU5BtB2xrcJVQk3pFLs0J6cz+nUVRtsm3Gz400 qaksn6T+azBX5Lv6pSPYmDtj+cSbCA7vcaLxHh414gKu6SKkNTm566xGM3RIKome odhacZtLvPYpfONIGt0YRgwl6oO+Q1dXuu4aoi2H4jdYrHEjpTFY1Pg1TfRrpM/p JxarI/VUOvuXZHAsJRBJshEc5GcOnaUAzYKr/yAelbdowjW2DLetRhWU0YZ9zgZk w6xaVNvcU0i9fX2Ri0MMiTpo92xzRdZd1WZ8wfU3hqUMfolVSMJuk8Qs/NyYm8v9 DMtiQb0Ewi10Y0YyGUnQi3r6wpKQ2K1D2JVZj5eGLsbTfBpi+3bilJHtxBc05NaK HQyZhhgXSTwLkR4LUcsyTtWdiS9uUB2D18EtfxODWoeJsIcoU2fRPX3zVIn0EjTq YLSrGvbk69xAiyhDQlcYFEUoL6GQb0WbDOz1b1IwRJ6de7YcNkkCAlWTt4qIat65 6OfZURSGURRWd9BBNqF2m1OgaGfv4fn/HJL4TYYaEXATpTUxVoPujxl73In5Mu3O A8zVP2QouGD25RYmoQLdAYMyap9XJIS1HWRNBPAyRC8z5YZE1ptm+L0KzBD9+vwe rTejW79L/QMsu9Orz6Mnptraz6C83q7C1hi7STqwNPd4rE8grV8= =MFmx -----END PGP SIGNATURE-----
On 2025-12-10 17:16, Paul Eggert via tz-announce via tz wrote:
This release corresponds to commit 7e1145bfdb9630c127841dc8ce808a937a300938 dated 2025-03-22 13:40:46 -0700
Unfortunately this citation was incorrect due to my cut-and-paste error in today's email announcing the 2025c release. The correct citation is to commit b81d0be187f04ca856fc5a68a7ec2b8e460bafef dated 2025-12-10 14:42:37 -0800[1]. Apologies for the error. [1]: https://github.com/eggert/tz/commit/b81d0be187f04ca856fc5a68a7ec2b8e460bafef
participants (1)
-
Paul Eggert