From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=HTML_MESSAGE, MAILING_LIST_MULTI,RCVD_IN_MSPIKE_H2 autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 5700 invoked from network); 11 Feb 2023 14:03:13 -0000 Received: from second.openwall.net (193.110.157.125) by inbox.vuxu.org with ESMTPUTF8; 11 Feb 2023 14:03:13 -0000 Received: (qmail 22048 invoked by uid 550); 11 Feb 2023 14:03:11 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Reply-To: musl@lists.openwall.com Received: (qmail 24407 invoked from network); 11 Feb 2023 06:53:52 -0000 From: "zhoujingqiang (A)" To: "musl@lists.openwall.com" CC: "yubing (C)" , liudongxu , "wangyunhe (A)" , qiuguorui , "Wanglieming (VRP SSP)" Thread-Topic: Time zone has not updated after call tzset() Thread-Index: Adk95Y3/tNqsyODCQVKdzDA4BfGmnw== Date: Sat, 11 Feb 2023 06:53:38 +0000 Message-ID: Accept-Language: zh-CN, en-US Content-Language: zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.67.109.132] Content-Type: multipart/alternative; boundary="_000_f875523c2c094e2db64cbcd13aace527huaweicom_" MIME-Version: 1.0 X-CFilter-Loop: Reflected Subject: [musl] Time zone has not updated after call tzset() --_000_f875523c2c094e2db64cbcd13aace527huaweicom_ Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 SGVsbG8sDQoNCk5vcm1hbGx5LCAvZXRjL2xvY2FsdGltZSBpcyBhIHNvZnQgbGluayB0byBhIGZp bGUgdGhhdCBzdG9yZXMgdGltZSB6b25lIGluZm9ybWF0aW9uLg0KDQpXaXRob3V0IHNldHRpbmcg dGhlIFRaIGVudmlyb25tZW50IHZhcmlhYmxlLCBJIGNoYW5nZSB0aGUgdGltZSB6b25lIGJ5IGNo YW5naW5nIHRoZSBmaWxlIGxpbmtlZCB0byAvZXRjL2xvY2FsdGltZS4gQWZ0ZXIgY2FsbGluZyB0 enNldCgpLCBJIGZpbmQgdGhhdCB0aGUgdGltZSB6b25lIGRvZXMgbm90IGNoYW5nZS4gVGhlIHRl c3QgY29kZSBpcyBhcyBmb2xsb3dzOg0KDQojaW5jbHVkZSA8dGltZS5oPg0KI2luY2x1ZGUgPGVy cm5vLmg+DQojaW5jbHVkZSA8c3RkaW8uaD4NCiNpbmNsdWRlIDxzaWduYWwuaD4NCiNpbmNsdWRl IDx1bmlzdGQuaD4NCg0Kdm9pZCBzaWcoaW50IHNpZ251bSkNCnsNCiAgICAgICAgdGltZV90IG5v dyA9ICh0aW1lX3QpLTE7DQogICAgICAgIHN0cnVjdCB0bSByZXN1bHQ7DQoNCiAgICAgICAgbm93 ID0gdGltZShOVUxMKTsNCiAgICAgICAgdHpzZXQoKTsNCiAgICAgICAgbG9jYWx0aW1lX3IoJm5v dywgJnJlc3VsdCk7DQoNCiNkZWZpbmUgUFNTUF9EQVRFVElNRV9MT0NBTF9GT1JNQVQgIiVZLSVt LSVkVCVIOiVNOiVTJXoiDQogICAgICAgIGNoYXIgbGluZVsxMDI0XTsNCiAgICAgICAgc3RyZnRp bWUobGluZSwgc2l6ZW9mKGxpbmUpLCBQU1NQX0RBVEVUSU1FX0xPQ0FMX0ZPUk1BVCwgJnJlc3Vs dCk7DQogICAgICAgIHByaW50ZigicmVzdWx0OiAlc1xuIiwgbGluZSk7DQp9DQoNCmludCBtYWlu KHZvaWQpDQp7DQoNCiAgICAgICAgc2lnbmFsKDQxLCBzaWcpOw0KICAgICAgICB3aGlsZSAoMSkg ew0KICAgICAgICAgICAgICAgIHNpZyg0MSk7DQogICAgICAgICAgICAgICAgc2xlZXAoMjApOw0K ICAgICAgICB9DQogICAgICAgIHJldHVybiAwOw0KfQ0KDQpUaGUgcmVzdWx0IGlzIGFzIGZvbGxv d3Ojug0KDQpyZXN1bHQ6IDIwMjMtMDItMTFUMTA6MDc6MDErMDgwMA0KcmVzdWx0OiAyMDIzLTAy LTExVDEwOjA3OjIxKzA4MDANCnJlc3VsdDogMjAyMy0wMi0xMVQxMDowNzo0MSswODAwDQpyZXN1 bHQ6IDIwMjMtMDItMTFUMTA6MDg6MDErMDgwMA0KDQpUaGUgdGVzdCBzdGVwcyBpcyBhcyBmb2xs b3dzOg0KDQoNCjEuICAgICAgIFRoZSB0ZXN0IHByb2dyYW0gZ2V0IGxvY2FsdGltZSBldmVyeSAy MCBzZWNvbmRzLg0KDQoyLiAgICAgICBJbml0aWFsbHksIC9ldGMvbG9jYWx0aW1lIGxpbmtzIHRv IC91c3Ivc2hhcmUvem9uZWluZm8vQXNpYS9Ib25nX0tvbmcNCmRhdGUgqENSOiBTYXQsIDExIEZl YiAyMDIzIDEwOjQwOjAwICswODAwDQoNCjMuICAgICAgIEFmdGVyIHRoZSB0ZXN0IHByb2dyYW0g aGFzIGJlZW4gcnVubmluZyBmb3IgYSB3aGlsZSwgY2hhbmdlIC9ldGMvbG9jYWx0aW1lIHRvIGxp bmsgdG8gL3Vzci9zaGFyZS96b25laW5mby9Bc2lhL0FkZW4NCmRhdGUgqENSOiBTYXQsIDExIEZl YiAyMDIzIDA1OjA3OjMwICswMzAwDQoNCjQuICAgICAgIFRoZSB0aW1lIHpvbmUgZGlzcGxheWVk IGluIHRoZSByZXN1bHQgZmllbGQgaXMgZXhwZWN0ZWQgdG8gY2hhbmdlLCBidXQgdGhlIHRpbWUg em9uZSBkb2VzIG5vdCBjaGFuZ2UuDQoNCkJhc2VkIG9uIGdsaWJjLCBleGVjdXRlIHRoZSBzYW1l IHRlc3QgY29kZSBhbmQgc3RlcHMuIFRoZSBydW5uaW5nIHJlc3VsdCBpcyBhcyBmb2xsb3dzOg0K DQpyZXN1bHQ6IDIwMjMtMDItMTFUMTA6NDY6NDErMDgwMA0KcmVzdWx0OiAyMDIzLTAyLTExVDEw OjQ3OjAxKzA4MDANCnJlc3VsdDogMjAyMy0wMi0xMVQwNTo0NzoyMSswMzAwDQpyZXN1bHQ6IDIw MjMtMDItMTFUMDU6NDc6NDErMDMwMA0KDQpJIGZvdW5kIHRoZSBwcm9ibGVtIGlzIGNhdXNlZCBi eSB0aGUgZG9fdHpzZXQgZnVuY3Rpb24uDQpUaGUgZ2xvYmFsIHZhcmlhYmxlIG9sZF90eiBjYWNo ZXMgdGhlIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGUgdGltZSB6b25lIHdoZW4gdGhlIHRpbWUg em9uZSBpcyB1cGRhdGVkIGxhc3QgdGltZS4gVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgY2FuIGJl IHRoZSB2YWx1ZSBvZiB0aGUgVFogZW52aXJvbm1lbnQgdmFyaWFibGUsIKGwL2V0Yy9sb2NhbHRp bWWhsSwgb3IgobBVVEOhsS4gSWYgdGhlIGN1cnJlbnQgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHRp bWUgem9uZSBpcyB0aGUgc2FtZSBhcyB0aGUgY2FjaGVkIHZhbHVlLCB0aGUgdGltZSB6b25lIHdp bGwgbm90IGJlIHVwZGF0ZWQuDQpUaGVyZWZvcmUsIHdoZW4gdGhlIGNhY2hlZCB2YWx1ZSBpcyCh sC9ldGMvbG9jYWx0aW1lobEsIHRoZSB0aW1lIHpvbmUgaXMgbm90IHVwZGF0ZWQgZXZlbiB0aG91 Z2ggdGhlIHRpbWUgem9uZSBmaWxlIGxpbmtlZCB0byChsC9ldGMvbG9jYWx0aW1lobEgY2hhbmdl cy4NCg0KVGhlIKGwL2V0Yy9sb2NhbHRpbWWhsSBkZXNjcmliZXMgdGhlIGZpbGUgcGF0aCBpbnN0 ZWFkIG9mIHRoZSB0aW1lIHpvbmUuIEkgc3VnZ2VzdCBub3Qgc3RvcmluZyBpdCB0byBvbGRfdHou IFRoZSByZWxhdGVkIGNvZGUgaXMgYXMgZm9sbG93czoNCg0Kc3RhdGljIHZvaWQgZG9fdHpzZXQo KQ0Kew0KICAgICAgICBjaGFyIGJ1ZltOQU1FX01BWCsyNV0sICpwYXRobmFtZT1idWYrMjQ7DQog ICAgICAgIGNvbnN0IGNoYXIgKnRyeSwgKnMsICpwOw0KICAgICAgICBjb25zdCB1bnNpZ25lZCBj aGFyICptYXAgPSAwOw0KICAgICAgICBzaXplX3QgaTsNCiAgICAgICAgc3RhdGljIGNvbnN0IGNo YXIgc2VhcmNoW10gPQ0KICAgICAgICAgICAgICAgIi91c3Ivc2hhcmUvem9uZWluZm8vXDAvc2hh cmUvem9uZWluZm8vXDAvZXRjL3pvbmVpbmZvL1wwIjsNCg0KICAgICAgICBzID0gZ2V0ZW52KCJU WiIpOw0KICAgICAgICBpZiAoIXMpIHMgPSAiL2V0Yy9sb2NhbHRpbWUiOw0KICAgICAgICBpZiAo ISpzKSBzID0gX191dGM7DQoNCiAgICAgICAgaWYgKG9sZF90eiAmJiAhc3RyY21wKHMsIG9sZF90 eikpIHJldHVybjsNCg0KICAgICAgICBmb3IgKGk9MDsgaTw1OyBpKyspIHIwW2ldID0gcjFbaV0g PSAwOw0KDQogICAgICAgIGlmICh6aSkgX19tdW5tYXAoKHZvaWQgKil6aSwgbWFwX3NpemUpOw0K DQogICAgICAgIC8qIENhY2hlIHRoZSBvbGQgdmFsdWUgb2YgVFogdG8gY2hlY2sgaWYgaXQgaGFz IGNoYW5nZWQuIEF2b2lkDQogICAgICAgICogZnJlZSBzbyBhcyBub3QgdG8gcHVsbCBpdCBpbnRv IHN0YXRpYyBwcm9ncmFtcy4gR3Jvd3RoDQogICAgICAgICogc3RyYXRlZ3kgbWFrZXMgaXQgc28g ZnJlZSB3b3VsZCBoYXZlIG1pbmltYWwgYmVuZWZpdCBhbnl3YXkuICovDQogICAgICAgIGkgPSBz dHJsZW4ocyk7DQogICAgICAgIGlmIChpID4gUEFUSF9NQVgrMSkgcyA9IF9fdXRjLCBpID0gMzsN CiAgICAgICAgaWYgKGkgPj0gb2xkX3R6X3NpemUpIHsNCiAgICAgICAgICAgICAgIG9sZF90el9z aXplICo9IDI7DQogICAgICAgICAgICAgICBpZiAoaSA+PSBvbGRfdHpfc2l6ZSkgb2xkX3R6X3Np emUgPSBpKzE7DQogICAgICAgICAgICAgICBpZiAob2xkX3R6X3NpemUgPiBQQVRIX01BWCsyKSBv bGRfdHpfc2l6ZSA9IFBBVEhfTUFYKzI7DQogICAgICAgICAgICAgICBvbGRfdHogPSBtYWxsb2Mo b2xkX3R6X3NpemUpOw0KICAgICAgICB9DQogICAgICAgIGlmIChvbGRfdHopIG1lbWNweShvbGRf dHosIHMsIGkrMSk7DQogICAgICAgIKGtDQp9DQo= --_000_f875523c2c094e2db64cbcd13aace527huaweicom_ Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: quoted-printable

Hello,

 

Normally, /etc/localtime is a s= oft link to a file that stores time zone information.

 

Without setting the TZ environm= ent variable, I change the time zone by changing the file linked to /etc/lo= caltime. After calling tzset(), I find that the time zone does not change. = The test code is as follows:

 

#include <time.h>

#include <errno.h>

#include <stdio.h>

#include <signal.h><= /o:p>

#include <unistd.h><= /o:p>

 

void sig(int signum)=

{

     &= nbsp;  time_t now =3D (time_t)-1;

     &= nbsp;  struct tm result;

 

     &= nbsp;  now =3D time(NULL);

     &= nbsp;  tzset();

     &= nbsp;  localtime_r(&now, &result);

 

#define PSSP_DATETIME_LOCAL_FOR= MAT "%Y-%m-%dT%H:%M:%S%z"

     &= nbsp;  char line[1024];

     &= nbsp;  strftime(line, sizeof(line), PSSP_DATETIME_LOCAL_FORMAT, &r= esult);

     &= nbsp;  printf("result: %s\n", line);

}

 

int main(void)

{

 

     &= nbsp;  signal(41, sig);

     &= nbsp;  while (1) {

     &= nbsp;          sig(41);

     &= nbsp;          sleep(20);=

     &= nbsp;  }

     &= nbsp;  return 0;

}

 

The result is as follows= =A3=BA=

 

result: 2023-02-11T10:07:01+= ;0800

result: 2023-02-11T10:07:21+= ;0800

result: 2023-02-11T10:07:41+= ;0800

result: 2023-02-11T10:08:01+= ;0800

 

The test steps is as follows:

 

1= .   &= nbsp;   The test program get lo= caltime every 20 seconds.

2= .   &= nbsp;   Initially, /etc/localti= me links to /usr/share/zoneinfo/Asia/Hong_Kong

date =A8CR: Sat, 11 Feb 2023 10= :40:00 +0800

3= .   &= nbsp;   After the test program = has been running for a while, change /etc/localtime to link to /usr/share/z= oneinfo/Asia/Aden

date =A8CR: Sat, 11 Feb 2023 05= :07:30 +0300

4= .   &= nbsp;   The time zone displayed= in the result field is expected to change, but the time zone does not chan= ge.

 

Based on glibc, execute the sam= e test code and steps. The running result is as follows:<= /p>

 

result: 2023-02-11T10:46:41+= ;0800

result: 2023-02-11T10:47:01+= ;0800

result: 2023-02-11T05:47:21+= ;0300

result: 2023-02-11T05:47:41+= ;0300

 

I found the problem is caused b= y the do_tzset function.

The global variable old_tz cach= es the string that describes the time zone when the time zone is updated la= st time. The value of the string can be the value of the TZ environment var= iable, =A1=B0/etc/localtime=A1=B1, or =A1=B0UTC=A1=B1. If the current string describing the time zone is the same as the cached valu= e, the time zone will not be updated.

Therefore, when the cached valu= e is =A1=B0/etc/localtime=A1=B1, the time zone is not updated even though t= he time zone file linked to =A1=B0/etc/localtime=A1=B1 changes.<= /span>

 

The =A1=B0/etc/localtime=A1=B1 = describes the file path instead of the time zone. I suggest not storing it = to old_tz. The related code is as follows:

 

static void do_tzset()

{

     &= nbsp;  char buf[NAME_MAX+25], *pathname=3Dbuf+24;

     &= nbsp;  const char *try, *s, *p;

     &= nbsp;  const unsigned char *map =3D 0;

     &= nbsp;  size_t i;

     &= nbsp;  static const char search[] =3D

     &= nbsp;         "/usr/share/zone= info/\0/share/zoneinfo/\0/etc/zoneinfo/\0";

 

     &= nbsp;  s =3D getenv("TZ");

     &= nbsp;  if (!s) s =3D "/etc/localtime";

     &= nbsp;  if (!*s) s =3D __utc;

 

     &= nbsp;  if (old_tz && !strcmp(s, old_tz)) return;

 

     &= nbsp;  for (i=3D0; i<5; i++) r0[i] =3D r1[i] =3D 0;

 

     &= nbsp;  if (zi) __munmap((void *)zi, map_size);

 

     &= nbsp;  /* Cache the old value of TZ to check if it has changed. Avoid<= o:p>

     &= nbsp;  * free so as not to pull it into static programs. Growth

     &= nbsp;  * strategy makes it so free would have minimal benefit anyway. = */

     &= nbsp;  i =3D strlen(s);

     &= nbsp;  if (i > PATH_MAX+1) s =3D __utc, i =3D 3;

     &= nbsp;  if (i >=3D old_tz_size) {

     &= nbsp;         old_tz_size *=3D 2;

     &= nbsp;         if (i >=3D old_tz_= size) old_tz_size =3D i+1;

     &= nbsp;         if (old_tz_size > = PATH_MAX+2) old_tz_size =3D PATH_MAX+2;

     &= nbsp;         old_tz =3D malloc(old= _tz_size);

     &= nbsp;  }

     &= nbsp;  if (old_tz) memcpy(old_tz, s, i+1);

     &= nbsp;  =A1=AD

}

--_000_f875523c2c094e2db64cbcd13aace527huaweicom_--