From 93037498d1f61f31e5b52d2f8d4aa437a26bc14e Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 25 Jun 2013 22:54:35 +0200 Subject: [PATCH] Fix time.mktime() and datetime.datetime.timestamp() on AIX On AIX, the C function mktime() alwaysd sets tm_wday, even on error. So tm_wday cannot be used as a sentinel to detect an error, we can only check if the result is (time_t)-1. --- Modules/_datetimemodule.c | 13 ++++++++++--- Modules/timemodule.c | 11 ++++++++++- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 8f60972e7e..46f38c5e82 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -4873,9 +4873,16 @@ datetime_timestamp(PyDateTime_DateTime *self) time.tm_wday = -1; time.tm_isdst = -1; timestamp = mktime(&time); - /* Return value of -1 does not necessarily mean an error, but tm_wday - * cannot remain set to -1 if mktime succeeded. */ - if (timestamp == (time_t)(-1) && time.tm_wday == -1) { + if (timestamp == (time_t)(-1) +#ifndef _AIX + /* Return value of -1 does not necessarily mean an error, + * but tm_wday cannot remain set to -1 if mktime succeeded. */ + && time.tm_wday == -1 +#else + /* on AIX, tm_wday is always sets, even on error */ +#endif + ) + { PyErr_SetString(PyExc_OverflowError, "timestamp out of range"); return NULL; diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 4b526d4d7d..297467f730 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -807,7 +807,16 @@ time_mktime(PyObject *self, PyObject *tup) tt = mktime(&buf); /* Return value of -1 does not necessarily mean an error, but tm_wday * cannot remain set to -1 if mktime succeeded. */ - if (tt == (time_t)(-1) && buf.tm_wday == -1) { + if (tt == (time_t)(-1) +#ifndef _AIX + /* Return value of -1 does not necessarily mean an error, but + * tm_wday cannot remain set to -1 if mktime succeeded. */ + && buf.tm_wday == -1 +#else + /* on AIX, tm_wday is always sets, even on error */ +#endif + ) + { PyErr_SetString(PyExc_OverflowError, "mktime argument out of range"); return NULL; -- 2.50.1