Skip to content

gh-159739: Preserve large years in time conversions - #160175

Open
jelle-openai wants to merge 2 commits into
python:mainfrom
jelle-openai:jelle/codex/gh-159739-time-large-year
Open

jelle-openai wants to merge 2 commits into
python:mainfrom
jelle-openai:jelle/codex/gh-159739-time-large-year

Conversation

@jelle-openai

@jelle-openai jelle-openai commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

The time module added 1900 to the C library year using int arithmetic, which overflowed for timestamps whose calendar year exceeds INT_MAX. On platforms that accept these timestamps, gmtime(), localtime(), and ctime() could report a negative year; perform the addition in a wider type. Backport to 3.15 and 3.14.

The time module added 1900 to the C library year using int arithmetic, which overflowed for timestamps whose calendar year exceeds INT_MAX. On platforms that accept these timestamps, gmtime(), localtime(), and ctime() could report a negative year; perform the addition in a wider type. Backport to 3.15 and 3.14.
Comment thread Modules/timemodule.c

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Won't datetime have the same issue?

Comment thread Modules/timemodule.c
SET_ITEM((INDEX), PyLong_FromLong((long) (VAL)))

SET(0, p->tm_year + 1900);
SET_ITEM(0, PyLong_FromLongLong((long long)p->tm_year + 1900));

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This fixes the forward direction, but gettmarg() still reads the year into a C int:

else if (!gettmarg(state, tup, &buf,
"iiiiiiiii;strftime(): illegal time tuple argument") ||
!checktm(&buf))

We should preserve the round trip.

Time tuple consumers parsed calendar years as C int before subtracting 1900, so they rejected valid struct_time results. Date and datetime timestamp conversion could also overflow before reporting the invalid year. Preserve the full time tuple range and report oversized datetime years correctly. Backport to 3.15 and 3.14.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants