Skip to content
Permalink
Browse files Browse the repository at this point in the history
Fixed ngx_gmtime() on 32-bit platforms with 64-bit time_t.
In ngx_gmtime(), instead of casting to ngx_uint_t we now work with
time_t directly.  This allows using dates after 2038 on 32-bit platforms
which use 64-bit time_t, notably NetBSD and OpenBSD.

As the code is not able to work with negative time_t values, argument
is now set to 0 for negative values.  As a positive side effect, this
results in Epoch being used for such values instead of a date in distant
future.
  • Loading branch information
mdounin committed Sep 13, 2017
1 parent 53bea39 commit 0206ebe
Showing 1 changed file with 10 additions and 8 deletions.
18 changes: 10 additions & 8 deletions src/core/ngx_times.c
Expand Up @@ -300,23 +300,25 @@ void
ngx_gmtime(time_t t, ngx_tm_t *tp)
{
ngx_int_t yday;
ngx_uint_t n, sec, min, hour, mday, mon, year, wday, days, leap;
ngx_uint_t sec, min, hour, mday, mon, year, wday, days, leap;

/* the calculation is valid for positive time_t only */

n = (ngx_uint_t) t;
if (t < 0) {
t = 0;
}

days = n / 86400;
days = t / 86400;
sec = t % 86400;

/* January 1, 1970 was Thursday */

wday = (4 + days) % 7;

n %= 86400;
hour = n / 3600;
n %= 3600;
min = n / 60;
sec = n % 60;
hour = sec / 3600;
sec %= 3600;
min = sec / 60;
sec %= 60;

/*
* the algorithm based on Gauss' formula,
Expand Down

0 comments on commit 0206ebe

Please sign in to comment.