This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re:[PATCH] tzset did not catch changes tolocaltime [BZ #21060 ]
- From: <ma dot jiang at zte dot com dot cn>
- To: <schwab at suse dot de>
- Cc: <carlos at redhat dot com>, <libc-alpha at sourceware dot org>
- Date: Mon, 17 Dec 2018 20:06:10 +0800 (CST)
- Subject: Re:[PATCH] tzset did not catch changes tolocaltime [BZ #21060 ]
- References: 201812171717582865803@zte.com.cn,mvmbm5k5w5u.fsf@suse.de
Hi schwab,
Thanks for the quick reply.
I have changed the patch into the following one, as you suggested. Is it OK now?
diff --git a/time/tzset.c b/time/tzset.c
index b517867..1431097 100644
--- a/time/tzset.c
+++ b/time/tzset.c
@@ -386,22 +386,27 @@ tzset_internal (int always)
if (tz && *tz == ':')
++tz;
- /* Check whether the value changed since the last run. */
- if (old_tz != NULL && tz != NULL && strcmp (tz, old_tz) == 0)
- /* No change, simply return. */
- return;
-
if (tz == NULL)
/* No user specification; use the site-wide default. */
tz = TZDEFAULT;
+ /* Check whether the tz value changed since the last run. */
+ bool tz_changed = (old_tz == NULL) || (strcmp (tz, old_tz) != 0);
+ if (old_tz == NULL || tz_changed)
+ {
+ /* Save the value of `tz'. */
+ free (old_tz);
+ old_tz = __strdup (tz);
+ }
+
+ /* When using tzfile, must check whether it changed in __tzfile_read. */
+ if (!__use_tzfile && !tz_changed)
+ return;
+
+ /* Going to recaculate values. */
tz_rules[0].name = NULL;
tz_rules[1].name = NULL;
- /* Save the value of `tz'. */
- free (old_tz);
- old_tz = tz ? __strdup (tz) : NULL;
-
/* Try to read a data file. */
__tzfile_read (tz, 0, NULL);
if (__use_tzfile)
------------------原始邮件------------------
发件人:AndreasSchwab <schwab@suse.de>
收件人:马江10100629;
抄送人:carlos@redhat.com <carlos@redhat.com>;libc-alpha@sourceware.org <libc-alpha@sourceware.org>;
日 期 :2018年12月17日 17:40
主 题 :Re: [PATCH] tzset did not catch changes tolocaltime [BZ #21060 ]
On Dez 17 2018, <ma.jiang@zte.com.cn> wrote:
> + /* Check whether the tz value changed since the last run. */
> + int tz_changed = old_tz ? strcmp (tz, old_tz) : 1;
This should be written as old_tz == NULL || strcmp (tz, old_tz) != 0,
and tz_changed should be bool.
> + if ((old_tz == NULL)
> + || (old_tz != NULL && tz_changed))
This is the same as tz_changed.
> + {
> + /* Save the value of `tz'. */
> + free (old_tz);
> + old_tz = __strdup (tz);
> + }
Wrong indentation.
Andreas.
--
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."