Bug 60742
| Summary: | python3-module-isal: BadGzipFile после обратного seek в igzip | ||
|---|---|---|---|
| Product: | Sisyphus | Reporter: | Vladislav Glinkin <glinkinvd> |
| Component: | python3-module-isal | Assignee: | Sergey Bolshakov <sbolshakov> |
| Status: | RESOLVED FIXED | QA Contact: | qa-sisyphus |
| Severity: | normal | ||
| Priority: | P5 | CC: | sbolshakov |
| Version: | unstable | ||
| Hardware: | x86_64 | ||
| OS: | Linux | ||
ждём реакции апстрима. python3-module-isal-1.9.0-alt1 -> sisyphus: Tue Nov 03 2026 Sergey Bolshakov <sbolshakov@altlinux> 1.9.0-alt1 - 1.9.0 released (closes: 60741, 60742) |

Description
Vladislav Glinkin 2026-09-29 17:53:18 MSKВерсия пакета: python3-module-isal-1.8.0-alt1 --- После чтения и обратного перемещения с помощью seek(0) объект igzip.open() может выдавать gzip.BadGzipFile для корректного gzip-архива. Ошибка воспроизводится и на архиве, созданном стандартным модулем gzip. Она препятствует повторному чтению и произвольному доступу в gzip-файлах. --- Шаги воспроизведения: 1) $ PYTHONNOUSERSITE=1 python3 - <<'PY' import gzip import io from isal import igzip data = b'hello world' * 24000 packed = gzip.compress(data) assert gzip.decompress(packed) == data with igzip.open(io.BytesIO(packed), 'rb') as stream: stream.seek(12345) assert stream.read(400) == data[12345:12745] stream.seek(0) assert stream.read() == data print('PASS') PY --- Фактический результат: gzip.BadGzipFile: Not a gzipped file (b'UU') --- Причина и исправление: В GzipReader_seek файла src/isal/isal_zlibmodule.c при обратном перемещении выполняются fp.seek(0), сброс inflater и перевод reader в фазу обработки заголовка. Однако указатели current_pos и buffer_end сохраняют прежний входной буфер сжатых данных. Его остаток принимается за новый gzip-заголовок. Маленькие файлы или другие последовательности чтения могут не вызывать ошибку: внешний BufferedReader иногда обслуживает seek из буфера распакованных данных без вызова проблемного C-кода. Исправление после успешного перемещения к началу сбрасывает оба указателя на input_buffer. Дополнительно освобождается Python-результат вызова seek (Py_DECREF(seek_result)). Непосредственная причина BadGzipFile устраняется сбросом указателей. Исправление отправлено upstream: PR:https://github.com/pycompression/python-isal/pull/258, коммит 1178365e6ffa5ddac3a50bfa2ab0e6d387b122d5.