From: Jeff Johnston <jjohnstn@redhat.com>
To: Newlib <newlib@sourceware.org>
Subject: Re: [PATCH] add tests for tzset(3)
Date: Fri, 29 Apr 2022 11:46:22 -0400 [thread overview]
Message-ID: <CAOox84vEt8sb7HaUNFDa=MRbk_wQPj-7LQbF+rbcVKn==Hp1QQ@mail.gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 212 bytes --]
I have revised my tzset_r.c patch so that the tzrules are initialized so we
don't inherit the previous settings if not specified for a particular TZ.
As well, I defaulted them if TZ is not specified.
-- Jeff J.
[-- Attachment #2: 0001-Modify-tzset_r.c-to-handle-errors.patch --]
[-- Type: text/x-patch, Size: 4850 bytes --]
From d49236849c69255090fa533177ac71ae3878cd7e Mon Sep 17 00:00:00 2001
From: Jeff Johnston <jjohnstn@redhat.com>
Date: Wed, 27 Apr 2022 15:27:00 -0400
Subject: [PATCH] Modify tzset_r.c to handle errors
- change __tzset_r so errors end up setting the timezone to
unnamed UTC
---
newlib/libc/time/tzset_r.c | 60 +++++++++++++++++++++++++++++++++-------------
1 file changed, 44 insertions(+), 16 deletions(-)
diff --git a/newlib/libc/time/tzset_r.c b/newlib/libc/time/tzset_r.c
index 9cb30b1..962652d 100644
--- a/newlib/libc/time/tzset_r.c
+++ b/newlib/libc/time/tzset_r.c
@@ -23,7 +23,9 @@ _tzset_unlocked_r (struct _reent *reent_ptr)
unsigned short hh, mm, ss, m, w, d;
int sign, n;
int i, ch;
+ long offset0, offset1;
__tzinfo_type *tz = __gettzinfo ();
+ struct __tzrule_struct default_tzrule = {'J', 0, 0, 0, 0, (time_t)0, 0L };
if ((tzenv = _getenv_r (reent_ptr, "TZ")) == NULL)
{
@@ -31,6 +33,8 @@ _tzset_unlocked_r (struct _reent *reent_ptr)
_daylight = 0;
_tzname[0] = "GMT";
_tzname[1] = "GMT";
+ tz->__tzrule[0] = default_tzrule;
+ tz->__tzrule[1] = default_tzrule;
free(prev_tzenv);
prev_tzenv = NULL;
return;
@@ -44,6 +48,14 @@ _tzset_unlocked_r (struct _reent *reent_ptr)
if (prev_tzenv != NULL)
strcpy (prev_tzenv, tzenv);
+ /* default to unnamed UTC in case of error */
+ _timezone = 0;
+ _daylight = 0;
+ _tzname[0] = "";
+ _tzname[1] = "";
+ tz->__tzrule[0] = default_tzrule;
+ tz->__tzrule[1] = default_tzrule;
+
/* ignore implementation-specific format specifier */
if (*tzenv == ':')
++tzenv;
@@ -85,8 +97,7 @@ _tzset_unlocked_r (struct _reent *reent_ptr)
if (sscanf (tzenv, "%hu%n:%hu%n:%hu%n", &hh, &n, &mm, &n, &ss, &n) < 1)
return;
- tz->__tzrule[0].offset = sign * (ss + SECSPERMIN * mm + SECSPERHOUR * hh);
- _tzname[0] = __tzname_std;
+ offset0 = sign * (ss + SECSPERMIN * mm + SECSPERHOUR * hh);
tzenv += n;
/* allow POSIX angle bracket < > quoted signed alphanumeric tz abbr e.g. <MESZ+0330> */
@@ -95,12 +106,16 @@ _tzset_unlocked_r (struct _reent *reent_ptr)
++tzenv;
/* quit if no items, too few or too many chars, or no close quote '>' */
- if (sscanf (tzenv, "%10[-+0-9A-Za-z]%n", __tzname_dst, &n) <= 0
- || n < TZNAME_MIN || TZNAME_MAX < n || '>' != tzenv[n])
+ if (sscanf (tzenv, "%10[-+0-9A-Za-z]%n", __tzname_dst, &n) <= 0 && tzenv[0] == '>')
{ /* No dst */
- _tzname[1] = _tzname[0];
- _timezone = tz->__tzrule[0].offset;
- _daylight = 0;
+ _tzname[0] = __tzname_std;
+ _tzname[1] = _tzname[0];
+ tz->__tzrule[0].offset = offset0;
+ _timezone = offset0;
+ return;
+ }
+ else if (n < TZNAME_MIN || TZNAME_MAX < n || '>' != tzenv[n])
+ { /* error */
return;
}
@@ -109,17 +124,20 @@ _tzset_unlocked_r (struct _reent *reent_ptr)
else
{
/* allow POSIX unquoted alphabetic tz abbr e.g. MESZ */
- if (sscanf (tzenv, "%10[A-Za-z]%n", __tzname_dst, &n) <= 0
- || n < TZNAME_MIN || TZNAME_MAX < n)
+ if (sscanf (tzenv, "%10[A-Za-z]%n", __tzname_dst, &n) <= 0)
{ /* No dst */
- _tzname[1] = _tzname[0];
- _timezone = tz->__tzrule[0].offset;
- _daylight = 0;
+ _tzname[0] = __tzname_std;
+ _tzname[1] = _tzname[0];
+ tz->__tzrule[0].offset = offset0;
+ _timezone = offset0;
+ return;
+ }
+ else if (n < TZNAME_MIN || TZNAME_MAX < n)
+ { /* error */
return;
}
}
- _tzname[1] = __tzname_dst;
tzenv += n;
/* otherwise we have a dst name, look for the offset */
@@ -138,9 +156,9 @@ _tzset_unlocked_r (struct _reent *reent_ptr)
n = 0;
if (sscanf (tzenv, "%hu%n:%hu%n:%hu%n", &hh, &n, &mm, &n, &ss, &n) <= 0)
- tz->__tzrule[1].offset = tz->__tzrule[0].offset - 3600;
+ offset1 = offset0 - 3600;
else
- tz->__tzrule[1].offset = sign * (ss + SECSPERMIN * mm + SECSPERHOUR * hh);
+ offset1 = sign * (ss + SECSPERMIN * mm + SECSPERHOUR * hh);
tzenv += n;
@@ -211,13 +229,23 @@ _tzset_unlocked_r (struct _reent *reent_ptr)
n = 0;
if (*tzenv == '/')
- sscanf (tzenv, "/%hu%n:%hu%n:%hu%n", &hh, &n, &mm, &n, &ss, &n);
+ if (sscanf (tzenv, "/%hu%n:%hu%n:%hu%n", &hh, &n, &mm, &n, &ss, &n) <= 0)
+ {
+ /* error in time format, restore tz rules to default and return */
+ tz->__tzrule[0] = default_tzrule;
+ tz->__tzrule[1] = default_tzrule;
+ return;
+ }
tz->__tzrule[i].s = ss + SECSPERMIN * mm + SECSPERHOUR * hh;
tzenv += n;
}
+ tz->__tzrule[0].offset = offset0;
+ tz->__tzrule[1].offset = offset1;
+ _tzname[0] = __tzname_std;
+ _tzname[1] = __tzname_dst;
__tzcalc_limits (tz->__tzyear);
_timezone = tz->__tzrule[0].offset;
_daylight = tz->__tzrule[0].offset != tz->__tzrule[1].offset;
--
1.8.3.1
next reply other threads:[~2022-04-29 15:46 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-29 15:46 Jeff Johnston [this message]
2022-05-12 18:35 ` jdoubleu
2022-05-16 17:49 ` Jeff Johnston
-- strict thread matches above, loose matches on Subject: below --
2022-04-07 15:58 jdoubleu
2022-04-08 21:21 ` Jeff Johnston
2022-04-10 8:43 ` Dimitar Dimitrov
2022-04-10 17:55 ` jdoubleu
2022-04-10 21:00 ` Dimitar Dimitrov
2022-04-11 11:17 ` jdoubleu
2022-04-11 17:27 ` Dimitar Dimitrov
2022-04-12 11:19 ` jdoubleu
2022-04-12 18:33 ` Brian Inglis
2022-04-07 23:34 ` [PATCH v2 0/2] add tzset/_r POSIX angle bracket <> support in TZ env var Brian Inglis
2022-04-13 17:53 ` [PATCH] add tests for tzset(3) Brian Inglis
2022-04-13 20:33 ` Jeff Johnston
2022-04-13 22:19 ` Brian Inglis
2022-04-14 8:59 ` jdoubleu
2022-04-14 16:31 ` Brian Inglis
2022-04-14 19:23 ` Jeff Johnston
2022-04-15 10:10 ` jdoubleu
2022-04-27 19:30 ` Jeff Johnston
2022-05-14 14:39 ` jdoubleu
2022-05-16 16:05 ` Dimitar Dimitrov
2022-05-16 17:38 ` Jeff Johnston
2022-04-13 22:21 ` Brian Inglis
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAOox84vEt8sb7HaUNFDa=MRbk_wQPj-7LQbF+rbcVKn==Hp1QQ@mail.gmail.com' \
--to=jjohnstn@redhat.com \
--cc=newlib@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).