newlib/winsup/cygwin/tzcode/localtime.c.patch

62 lines
1.9 KiB
Diff

--- localtime.c 2020-05-16 21:54:00.533111800 -0700
+++ localtime.c.patched 2020-05-22 00:03:30.826646000 -0700
@@ -413,7 +413,7 @@
};
/* TZDIR with a trailing '/' rather than a trailing '\0'. */
-static char const tzdirslash[sizeof TZDIR] = TZDIR "/";
+static char const tzdirslash[sizeof TZDIR + 1] = TZDIR "/";
/* Local storage needed for 'tzloadbody'. */
union local_storage {
@@ -473,7 +473,7 @@
would pull in stdio (and would fail if the
resulting string length exceeded INT_MAX!). */
memcpy(lsp->fullname, tzdirslash, sizeof tzdirslash);
- strcpy(lsp->fullname + sizeof tzdirslash, name);
+ strcpy(lsp->fullname + sizeof tzdirslash - 1, name);
/* Set doaccess if NAME contains a ".." file name
component, as such a name could read a file outside
@@ -488,11 +488,11 @@
name = lsp->fullname;
}
if (doaccess && access(name, R_OK) != 0)
- return errno;
+ goto trydefrules;
fid = open(name, OPEN_MODE);
if (fid < 0)
- return errno;
+ goto trydefrules;
nread = read(fid, up->buf, sizeof up->buf);
if (nread < (ssize_t)tzheadsize) {
int err = nread < 0 ? errno : EINVAL;
@@ -501,6 +501,17 @@
}
if (close(fid) < 0)
return errno;
+ if (0) {
+ const char *base;
+trydefrules:
+
+ base = strrchr(name, '/');
+ base = base ? base + 1 : name;
+ if (strcmp(base, TZDEFRULES))
+ return errno;
+ nread = sizeof _posixrules_data;
+ memcpy(up->buf, _posixrules_data, nread);
+ }
for (stored = 4; stored <= 8; stored *= 2) {
int_fast32_t ttisstdcnt = detzcode(up->tzhead.tzh_ttisstdcnt);
int_fast32_t ttisutcnt = detzcode(up->tzhead.tzh_ttisutcnt);
@@ -1417,6 +1428,8 @@
tzsetlcl(char const *name)
{
struct state *sp = __lclptr;
+ if (! name)
+ name = tzgetwintzi(__UNCONST(wildabbr), (char *) alloca (512));
int lcl = name ? strlen(name) < sizeof lcl_TZname : -1;
if (lcl < 0 ? lcl_is_set < 0
: 0 < lcl_is_set && strcmp(lcl_TZname, name) == 0)