Opened 3 weeks ago
Last modified 3 weeks ago
#37417 new Bug
Date-based generic views crash with OverflowError at the date range limits
| Reported by: | Philip Sørensen | Owned by: | |
|---|---|---|---|
| Component: | Generic views | Version: | 6.1 |
| Severity: | Normal | Keywords: | |
| Cc: | Philip Sørensen | Triage Stage: | Accepted |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
#28209 made the date-based generic views return a 404 rather than crash when given an out-of-range date. The fix caught the ValueError from date.replace() in _get_next_year() and _get_next_month(), and _get_next_week() catches OverflowError. However, two other paths do timedelta arithmetic at datetime.date.max / datetime.date.min with no handling, and they still crash with OverflowError: date value out of range (HTTP 500):
DayMixin._get_next_day()— e.g. aDayArchiveViewwithallow_empty=Trueat/9999/dec/31/. This is reachable with the URL pattern from the docs,<int:year>/<str:month>/<int:day>/. (#28209 comment 5 lists_get_next_day()as affected, but the committed fix didn't touch it.)_get_next_prev()computing the previous period withallow_empty=True:get_current(start - timedelta(days=1)). This crashes forYearArchiveView,MonthArchiveView,WeekArchiveViewandDayArchiveViewwhen the date is in year 1, e.g.year="0001". (A<int:year>converter strips the leading zeros, so this needs a 4-digit regex or str pattern.)
Patch: raise Http404(_("Date out of range")) in both places. That is the same behavior and message as the existing _get_next_week() handling and test_year_out_of_range. An alternative for the "previous" case would be returning None (no previous link), but I kept it consistent with the #28209 approach.
Change History (4)
comment:1 by , 3 weeks ago
comment:2 by , 3 weeks ago
| Triage Stage: | Unreviewed → Accepted |
|---|
comment:3 by , 3 weeks ago
| Owner: | set to |
|---|---|
| Status: | new → assigned |
comment:4 by , 3 weeks ago
| Owner: | removed |
|---|---|
| Status: | assigned → new |
Please make sure to assign yourself when taking a ticket, this was unassigned yet a patch was made 2 days ago
Reproduced on main (f1d11117c6). DayArchiveView with allow_empty=True at 9999-12-31 crashes with OverflowError: date value out of range, and so do the year/month/week/day archive views for year 0001 with allow_empty=True (and the DateTimeField case). The tests from PR 22133 fail with OverflowError on main and pass with the patch.