[erlang-patches] Fix calendar:local_time_to_universal_time_dst/2 bug of return value -1 from mktime

Kenji Rikitake <>
Thu Feb 11 00:20:20 CET 2010

Bjorn and all:

I would like the mktime fix of erl_time_sup.c to be included ASAP.
(check out
git fetch git://github.com/jj1bdx/otp.git local_to_univ
for the patch details)

In the message <>
dated Wed, Feb 10, 2010 at 03:26:07PM +0100,
Bjorn Gustavsson <> writes:
> We don't want the change in calendar.erl.
> The documentation says that local_time_to_universal_time_dst/1
> returns an empty list for a time that does not exist. We don't want
> the same return value for a valid time that cannot be handled because
> of an implementation detail.

I will not argue against this decision for the time being.

> We may consider using the patch for erl_time_sup.c, if you can
> provide some information to show that it is really needed. Note
> that the BIF does a range check of its arguments. Are there some
> values of the arguments that slip through the range check and
> cause mktime() to return -1?
> Since such a change is considered a bug fix, we can accept
> it after the feature freeze today.

Paul Guyot summarized the case in


"I found a bug in Erlang/OTP R12B-4 that occurs on FreeBSD 7.0 with TZ
set to UTC. On such systems, mktime(3) returns -1 when is_dst is set
to true. According to SUSv3, the OS can return -1 when the time since
Epoch cannot be represented, and therefore FreeBSD is perfectly
allowed to do so.


The POSIX doc for mktime in the above opengroup.org link shows the
following definition for the return value:


    The mktime() function shall return the specified time since the
    Epoch encoded as a value of type time_t. If the time since the Epoch
    cannot be represented, the function shall return the value
    (time_t)-1 and may set errno to indicate the error.


And a source code of error checking example as:

    /* What day of the week is July 4, 2001? */

    #include <stdio.h>
    #include <time.h>

    struct tm time_str;

    char daybuf[20];

    int main(void)
        time_str.tm_year = 2001 - 1900;
        time_str.tm_mon = 7 - 1;
        time_str.tm_mday = 4;
        time_str.tm_hour = 0;
        time_str.tm_min = 0;
        time_str.tm_sec = 1;
        time_str.tm_isdst = -1;
        if (mktime(&time_str) == -1) /* <-- HERE */
        else {
            (void)strftime(daybuf, sizeof(daybuf), "%A", &time_str);
        return 0;


So I think the -1 return value of mktime should be properly handled.

Kenji Rikitake

> -- 
> Björn Gustavsson, Erlang/OTP, Ericsson AB
> ________________________________________________________________
> erlang-patches (at) erlang.org mailing list.
> See http://www.erlang.org/faq.html
> To unsubscribe; mailto:

More information about the erlang-patches mailing list