Daniel McDonald <danielmcdon...@ucsd.edu> added the comment:
The use of tm_isdst=1 appears to trigger the overflow, and occurs when varying other aspects of the timetuple. Python's mktime wrapper can throw OverflowError in two places. The thrown error is the second location, following the call to glibc's mktime occurring in this specific if block: https://github.com/python/cpython/blob/f62420c3d3f5d87f2b57e54b2a98682bc835f7b6/Modules/timemodule.c#L1038-L1046 Modification of Modules/timemodule.c as to printf tm struct members confirms that when tm_isdst=1, the result from mktime() is -1, and the tm_wday member is set to -1, the combination of which triggers the conditional. mktime within the Github Action ubuntu-latest (20.04) environment is sourced from glibc 2.31 as confirmed by ldd and nm on the compiled Python binary. As a proof of concept, C program was written that calls mktime independent of CPython (can be compiled with "gcc bug.c -o bug"). The code below succeeds on both OSX 11.6.1 and Centos 7.9: #include <time.h> #include <stdio.h> void do_test() { struct tm tm_works = { .tm_year=117, .tm_mon=4, .tm_mday=26, .tm_hour=15, .tm_min=30, .tm_sec=16, .tm_wday=4, .tm_yday=145, .tm_isdst=-1 }; struct tm tm_fails = { .tm_year=117, .tm_mon=4, .tm_mday=26, .tm_hour=15, .tm_min=30, .tm_sec=16, .tm_wday=4, .tm_yday=145, .tm_isdst=1 }; time_t works = mktime(&tm_works); time_t fails = mktime(&tm_fails); if(works == -1) { printf("Unexpected failure\n"); } else { if(works == fails) { printf("Test passed\n"); } else { printf("Test failed: works=%d; fails=%d\n", (int)works, (int)fails); } } } int main(int argc, char **argv) { do_test(); } When compiled and run within in the Github Actions ubuntu-latest (20.04) environment, the erroneous behavior occurs: https://github.com/wasade/cpython/runs/4541212472?check_suite_focus=true#step:17:57 The use of tm_isdst=1 is valid according to multiple sources, a few examples are linked below. The sources are consistent, and indicate a positive value means Daylight Savings Time is in effect. https://www.gnu.org/software/libc/manual/html_node/Broken_002ddown-Time.html https://www.cplusplus.com/reference/ctime/tm/ At this time, I believe this remains unexpected behavior, however the source appears upstream of CPython as mktime is part of glibc. Unless suggested otherwise, I'll open an issue with on the glibc tracker. ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue44413> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com