time: Use int, not long int, for internal GMT offsets

The GMT offset can be outside the range of a 16-bit int type, which
is presumably the reason why long int was used in struct tm.  We
cannot change struct tm, but we can change the internal type for
the offset.
This commit is contained in:
Florian Weimer 2019-02-03 09:55:41 +01:00
parent ee9941f94e
commit 77c7d55ece
4 changed files with 19 additions and 8 deletions

View file

@ -1,3 +1,14 @@
2019-02-03 Florian Weimer <fweimer@redhat.com>
* include/time.h (__tzfile_default): Use int, not long int, for
the GMT offsets.
* time/tzfile.c (struct ttinfo): Change type of the offset member
to int.
(__tzfile_read): Remove useless cast.
(__tzfile_default): Adjust prototype.
* time/tzset.c (tz_rule): Change type of the offset member to int.
(parse_offset): Change the type of the sign variable to int.
2019-02-03 Florian Weimer <fweimer@redhat.com>
[BZ #24153]

View file

@ -43,7 +43,7 @@ extern void __tzfile_compute (__time64_t timer, int use_localtime,
long int *leap_correct, int *leap_hit,
struct tm *tp) attribute_hidden;
extern void __tzfile_default (const char *std, const char *dst,
long int stdoff, long int dstoff)
int stdoff, int dstoff)
attribute_hidden;
extern void __tzset_parse_tz (const char *tz) attribute_hidden;
extern void __tz_compute (__time64_t timer, struct tm *tm, int use_localtime)

View file

@ -35,7 +35,7 @@ static time_t tzfile_mtime;
struct ttinfo
{
long int offset; /* Seconds east of GMT. */
int offset; /* Seconds east of GMT. */
unsigned char isdst; /* Used to set tm_isdst. */
unsigned char idx; /* Index into `zone_names'. */
unsigned char isstd; /* Transition times are in standard time. */
@ -345,7 +345,7 @@ __tzfile_read (const char *file, size_t extra, char **extrap)
/* Bogus index in data file. */
goto lose;
types[i].idx = c;
types[i].offset = (long int) decode (x);
types[i].offset = decode (x);
}
if (__glibc_unlikely (__fread_unlocked (zone_names, 1, chars, f) != chars))
@ -491,7 +491,7 @@ __tzfile_read (const char *file, size_t extra, char **extrap)
void
__tzfile_default (const char *std, const char *dst,
long int stdoff, long int dstoff)
int stdoff, int dstoff)
{
size_t stdlen = strlen (std) + 1;
size_t dstlen = strlen (dst) + 1;

View file

@ -50,7 +50,7 @@ typedef struct
unsigned short int m, n, d; /* Month, week, day. */
int secs; /* Time of day. */
long int offset; /* Seconds east of GMT (west if < 0). */
int offset; /* Seconds east of GMT (west if < 0). */
/* We cache the computed time of change for a
given year so we don't have to recompute it. */
@ -193,11 +193,11 @@ parse_offset (const char **tzp, int whichrule)
&& (*tz == '\0' || (*tz != '+' && *tz != '-' && !isdigit (*tz))))
return false;
long sign;
int sign;
if (*tz == '-' || *tz == '+')
sign = *tz++ == '-' ? 1L : -1L;
sign = *tz++ == '-' ? 1 : -1;
else
sign = -1L;
sign = -1;
*tzp = tz;
unsigned short int hh;