On Wed, 1 Sep 2021 06:45:26 GMT, Wu Yan <wu...@openjdk.org> wrote:

> Hi,
> Please help me review the change to enhance getting  time zone ID from 
> /etc/localtime on linux.
> 
> We use `realpath` instead of `readlink` to obtain the link name of 
> /etc/localtime, because `readlink` can only read the value of a symbolic of 
> link, not the canonicalized absolute pathname.
> 
> For example, the value of /etc/localtime is 
> "../usr/share/zoneinfo//Asia/Shanghai", then the linkbuf obtained by 
> `readlink` is "../usr/share/zoneinfo//Asia/Shanghai", and then the call of 
> `getZoneName(linkbuf)` will get "/Asia/Shanghai", not "Asia/Shanghai", which 
> consider as invalid in `ZoneInfoFile.getZoneInfo()`. Using `realpath`, you 
> can get “/usr/share/zoneinfo/Asia/Shanghai“ directly from “/etc/localtime“.
> 
> Thanks,
> wuyan

Using `realpath` instead of `readlink` will change results on systems which use 
symbolic links instead of hard links to de-duplicate the timezone files. For 
example, on Debian, if `UTC` is configured (`/etc/localtime` points to 
`/usr/share/zoneinfo/UTC`), I think the result will be `Etc/UTC` instead of 
`UTC` after this change. But I have not actually tested this.

src/java.base/unix/native/libjava/TimeZone_md.c line 292:

> 290:         /* canonicalize the path */
> 291:         char resolvedpath[PATH_MAX + 1];
> 292:         char *path = realpath(DEFAULT_ZONEINFO_FILE, resolvedpath);

You really should use `realpath` with `NULL` as the second argument, to avoid 
any risk of buffer overflow. Future C library headers may warn about non-null 
arguments here.

-------------

PR: https://git.openjdk.java.net/jdk/pull/5327

Reply via email to