diff options
| author | bez-tch <[email protected]> | 2026-06-30 18:48:58 +0300 |
|---|---|---|
| committer | bez-tch <[email protected]> | 2026-06-30 19:22:49 +0300 |
| commit | a158b3365c1d755ee7c6948424b8e887f68272bf (patch) | |
| tree | adc0c74b45a03891fa854905f09e4a946a0c5562 /contrib/tools/python3/Python/clinic/Python-tokenize.c.h | |
| parent | 40a6f6be62893798189fdbfbef455f80f76f8e4e (diff) | |
Fix L-N day-of-month crossing a month boundary
**Проблема**
TCronExpression::CronNext/CronPrev бросал `library/cpp/cron_expression/cron_expression.cpp: Requested date does not exist`
для валидного выражения вроде `59 59 23 * *` (UTC) в определённые даты (например, когда now = 30 июня → следующее срабатывание должно быть 30 июля 23:59:59).
**Причина**
В DoNextPrev шаг по дню месяца определяет, изменилась ли дата, сравнивая только номер дня (value == updateValue). Однако FindDay может перевести календарь через границу месяца/года, попав при этом на тот же номер дня (30 июня → 30 июля, в
обоих случаях день 30, потому что `` — это фиксированное смещение от конца месяца). Цикл тогда считает, что ничего не изменилось, пропускает continue, который пере-резолвит секунды/минуты/часы, и оставляет поля времени, которые FindDay уже
сбросил в 00:00:00. Финальная проверка консистентности отклоняет 00:00:00 относительно second=\{59\} и бросает исключение.
Это было замаскировано, потому что существующие тесты используют \* для полей времени, где 00:00:00 — валидное совпадение.
**Фикс**
Сохраняем месяц/год до вызова FindDay и требуем, чтобы они остались неизменными (в дополнение к номеру дня), прежде чем считать день окончательным; иначе — перезапускаем цикл. Затрагивает оба направления.
commit_hash:62055eed169ba210e81c89aab860301f3e445f46
Diffstat (limited to 'contrib/tools/python3/Python/clinic/Python-tokenize.c.h')
0 files changed, 0 insertions, 0 deletions
