fix(unpack): Не падать на записях с датой раньше 1601 года - #47
Merged
Merged
Conversation
onec_dtools читает FILETIME как беззнаковый "Q", поэтому -17400000000 превращается в 18446744056309551616, и datetime + timedelta бросает OverflowError. Падение происходит при разборе оглавления, до записи первого файла, — пользователь получает «Неожиданная ошибка: date value out of range» и ноль файлов на выходе. Такие записи есть в настоящих поставках с releases.1c.ru. Проверено на двух скачанных дистрибутивах: Бухгалтерия государственного учреждения 2.0.110.66 — 10 записей из 83 Бухгалтерия предприятия КОРП 3.0.206.19 — 21 запись из 26 До правки оба давали [ERROR] и пустой каталог. После — распаковываются целиком: 83 файла (2.3 ГБ) и 26 файлов (946 МБ), размеры совпадают с объявленными в оглавлении до байта. Разбор описания записи больше не делегируется onec_dtools: FILETIME читается знаковым, а непредставимая дата даёт None вместо исключения. Файл получает текущее время — так же, как для всех прочих дат вне диапазона, что уже делал _apply_file_mtime. Это наиболее вероятная причина #3 и #5: продукты совпадают с названными там, механизм отказа — тот же. Тесты: 310 -> 322.
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Наиболее вероятная причина #3 и #5. Найдено при разборе настоящих дистрибутивов с releases.1c.ru.
Что происходит
onec_dtools.read_included_file_infoчитает FILETIME как беззнаковый"Q". Дата раньше 1601 года хранится как отрицательное 64-битное число, и-17400000000превращается в18446744056309551616. Дальшеdatetime(1601,1,1) + timedelta(microseconds=...)бросаетOverflowError.Падение происходит при разборе оглавления, до записи первого файла — отсюда симптом «вообще не распаковывает», а не «распаковал половину».
Это не синтетика
Значение взято из реального
1cv8.efd. Прогон настоящих дистрибутивов, скачанных с releases.1c.ru:Распаковка настоящего
1cv8.efdизAccountingCorp— до и после правки:БГУ, тот самый продукт из #3:
Целостность сверена с оглавлением: 26 из 26 записей совпали по размеру до байта, расхождений нет.
Почему это #3 и #5
StateAccountingэто и есть «Бухгалтерия государственного учреждения», и она содержит дефект.Попутно опровергается гипотеза из #13: там основным подозреваемым был
assert header == 1. В обоих файлахheader == 1, дело не в нём.Правка
Разбор описания записи больше не делегируется
onec_dtools: FILETIME читается знаковым, непредставимая дата даётNoneвместо исключения. Файл получает текущее время — ровно так же, как для всех прочих дат вне диапазона, что_apply_file_mtimeуже делал.Отдельно стоит отметить: в
AccountingCorpесть и записи с положительными, но бессмысленными датами —1602-10-14,1604-07-27. Они не роняли разбор и попадали под существующее отсечение поMIN_REPRESENTABLE_MTIME. Трогать их не понадобилось.Тесты
310 → 322. Три обратные мутации:
"Q"1 failedonec_dtools2 failed3 failedПервый прогон мутаций дал ложно-зелёный результат, и это стоит зафиксировать: Apple-сборка Python 3.9 на macOS хранит байт-код не в
__pycache__, а в централизованном кэше~/Library/Caches/com.apple.python/. Подмена"q"на"Q"не меняет размер файла, восстановление прошло в ту же секунду — и кэш счёл запись актуальной. Ни чистка__pycache__, ни-Bне помогают:-Bзапрещает запись, а не чтение. Мутационную проверку на этой машине нужно сопровождать удалением каталога в~/Library/Caches/com.apple.python/.Там же нашлась настоящая дыра в моём тесте: проверка с названием «читает знаковым» проходила и на
"Q", потому что конвертер гасит и беззнакового гиганта через переполнение. Добавлен отдельный тест, который пиннит именно знаковость.