[akr at m17n.org: bin/27630: mktime problem.]

Garrett Wollman wollman at khavrinen.lcs.mit.edu
Fri May 25 18:00:30 UTC 2001

A FreeBSD user submitted the following bug report.  I'm curious as to
whether the current tzcode still has this problem.  My analysis
follows at the end.


------- start of forwarded message (RFC 934 encapsulation) -------
Message-Id: <20010525021018.01D54727 at flux.etl.go.jp>
Reply-To: akr at m17n.org
X-Send-Pr-Version: 3.2
List-ID: <freebsd-bugs.FreeBSD.ORG>
List-Archive: <http://docs.freebsd.org/mail/> (Web Archive)
List-Help: <mailto:majordomo?subject=help> (List Instructions)
List-Subscribe: <mailto:majordomo?subject=subscribe%20freebsd-bugs>
List-Unsubscribe: <mailto:majordomo?subject=unsubscribe%20freebsd-bugs>
X-Loop: FreeBSD.org
Precedence: bulk
From: akr at m17n.org
Sender: owner-freebsd-bugs at FreeBSD.ORG
To: FreeBSD-gnats-submit at FreeBSD.ORG
Subject: bin/27630: mktime problem.
Date: Fri, 25 May 2001 11:10:18 +0900 (JST)

>Number:         27630
>Category:       bin
>Synopsis:       mktime failure.
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu May 24 19:20:00 PDT 2001
>Originator:     Tanaka Akira
>Release:        FreeBSD 4.2-RELEASE i386

FreeBSD flux 4.2-RELEASE FreeBSD 4.2-RELEASE #2: Fri Jan 12 22:55:02 JST 2001     akr at flux:/usr/src/sys/compile/AKR  i386


mktime(3) fails on some condition.

For example, TZ=Africa/Monrovia, 1972/05/01 00:44:30 cannot be converted to
time_t.  Since this example is taken from `zdump -v Africa/Monrovia' and it
is after Epoch, there is no reason to fail.

Actually, I tested all time listed in `zdump -v' for each timezone in
/usr/share/zoneinfo and found many failures.  Above failure is one of them.


% cat tst.c 
#include <stdio.h>
#include <time.h>

int main()
  struct tm a;
  time_t t;

  a.tm_year = 1972 - 1900;
  a.tm_mon = 5 - 1;
  a.tm_mday = 1;
  a.tm_hour = 0;
  a.tm_min = 44;
  a.tm_sec = 30;
  a.tm_wday = 0;
  a.tm_yday = 0;
  a.tm_isdst = -1;

  t = mktime(&a);
  if (t == -1) {
  printf("no problem\n");
  return 0;
% gcc tst.c
% TZ=Africa/Monrovia ./a.out   
mktime: Undefined error: 0



To Unsubscribe: send mail to majordomo at FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
------- end -------

This problem appears to result from the `saved_seconds' hackery in

                saved_seconds = yourtm.tm_sec;
                yourtm.tm_sec = 0;

time2() then goes on to attempt to find (in this example)
1972-05-01T00:44:00, which does not exist in this time zone, and
returns failure.


More information about the tz mailing list