tzcode95b.tar.gz and tzdata95b.tar.gz
Earl Chew
earl at hpato.aus.hp.com
Sat Mar 11 19:42:32 UTC 1995
: The files tzcode95b.tar.gz and tzdata95b.tar.gz are now available by anonymous
: ftp from elsie.nci.nih.gov. Minor changes in both: the "code" file contains
: a workaround for the lack of "unistd.h" in Microsoft C++ version 7; the "data"
: file contains a fixed "Link" for America/Shiprock.
I've picked up the new code and see that the tzload() code is still using
FILENAME_MAX.
There is a practical problem here. On many systems, the maximum pathname is
something like 256 or 1024 (as defined by PATHMAX in limits.h (assuming
something like a Posix system).
This makes the intent of the code unrealisable (ie that TZDIR can be used to
specify which zone file to read).
One could argue that these systems are broken :-(
Why not avoid the problem altogether and simply allocate sufficient memory for
the constructed filename?
I enclose a patch below.
Earl
--
+-------------------------------------------------------------------------+
| Earl Chew Email: earl at hpato.aus.hp.com |
| Australian Telecom Operation Voice: +61 3 272 8380 |
| Hewlett-Packard Australia Ltd Fax: +61 3 898 9257 |
| 31 Joseph St, Blackburn 3130, Australia GPS: 37 48'44"S 145 8'51"E |
+-------------------------------------------------------------------------+
*** localtime.c.orig Sat Mar 11 15:13:34 1995
--- localtime.c Sat Mar 11 15:33:00 1995
***************
*** 259,280 ****
return -1;
{
register int doaccess;
! /*
! ** Section 4.9.1 of the C standard says that
! ** "FILENAME_MAX expands to an integral constant expression
! ** that is the sie needed for an array of char large enough
! ** to hold the longest file name string that the implementation
! ** guarantees can be opened."
! */
! char fullname[FILENAME_MAX + 1];
if (name[0] == ':')
++name;
doaccess = name[0] == '/';
if (!doaccess) {
if ((p = TZDIR) == NULL)
return -1;
! if ((strlen(p) + strlen(name) + 1) >= sizeof fullname)
return -1;
(void) strcpy(fullname, p);
(void) strcat(fullname, "/");
--- 259,275 ----
return -1;
{
register int doaccess;
! char *fullname;
+ fullname = NULL;
if (name[0] == ':')
++name;
doaccess = name[0] == '/';
if (!doaccess) {
if ((p = TZDIR) == NULL)
return -1;
! fullname = malloc(strlen(p) + 1 + strlen(name) + 1);
! if (fullname == NULL)
return -1;
(void) strcpy(fullname, p);
(void) strcat(fullname, "/");
***************
*** 286,295 ****
doaccess = TRUE;
name = fullname;
}
! if (doaccess && access(name, R_OK) != 0)
! return -1;
! if ((fid = open(name, OPEN_MODE)) == -1)
return -1;
}
{
struct tzhead * tzhp;
--- 281,296 ----
doaccess = TRUE;
name = fullname;
}
! if ((doaccess && access(name, R_OK) != 0) ||
! ((fid = open(name, OPEN_MODE)) == -1))
! {
! if (fullname != NULL)
! free(fullname);
return -1;
+ }
+ if (fullname != NULL)
+ free(fullname);
+ name = NULL;
}
{
struct tzhead * tzhp;
More information about the tz
mailing list