amd64/109584: zdump doesn't work

Vasil Dimov vd at FreeBSD.org
Wed Feb 28 07:11:45 UTC 2007


On Tue, Feb 27, 2007 at 14:54:14 -0500, John Baldwin wrote:
[...]
> zdump works by trying to enumerate all the possible 
> values of time_t.  On a 32-bit machine this means going from -2^31 to
> 2^31 - 1.  On amd64 which has a 64-bit time_t, this means from from -2^63 to 
> 2^63 - 1.

Yes, this is true.

> If you understand exponential math you will see that the zone files aren't 
> corrupted, and zdump isn't hung.  Rather, it's just taking a long time to 
> run.

I think this is not the case. It is actually hung in infinite loop in
localtime(3) in libc. Try the following code on amd64 platform:

--- cut ---
time_t	t;
t = -9223372036762365600;
localtime(&t);
--- cut ---

it hangs in this loop:

src/lib/libc/stdtime/localtime.c:
1320         y = EPOCH_YEAR;
1321 #define LEAPS_THRU_END_OF(y)    ((y) / 4 - (y) / 100 + (y) / 400)
1322         while (days < 0 || days >= (long) year_lengths[yleap = isleap(y)]) {
1323                 long    newy;
1324
1325                 newy = y + days / DAYSPERNYEAR;
1326                 if (days < 0)
1327                         --newy;
1328                 days -= (newy - y) * DAYSPERNYEAR +
1329                         LEAPS_THRU_END_OF(newy - 1) -
1330                         LEAPS_THRU_END_OF(y - 1);
1331                 y = newy;
1332         }

where days oscillates between -1 and 365, y and newy between
-292277022654 and -292277022655. E.g. try so see what happens if you
enter the loop with days=365 and y=-292277022655.

-- 
Vasil Dimov
gro.DSBeerF at dv
%
Grelb's Reminder:
        Eighty percent of all people consider themselves to be above
average drivers.


More information about the freebsd-amd64 mailing list