python / python/cpython

iconv codecs corrupt stateful encodings when decoding incrementally

Đang mở
#154,859 1 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

3.16 stdlib type-bug
Ngôn ngữ chính
Python
Star
77.2k
Fork
35.9k
Chỉ số merge pull request
Chỉ số pull request đang chờ

Mô tả

Bug description:

The iconv-backed codecs start a fresh conversion on every call, so an incremental decode of a stateful encoding loses the shift state and silently returns wrong text. iso-2022-cn has no built-in codec, so the plain name reaches the iconv codec:

import codecs
blob = 'ABC中文DEF'.encode('iso-2022-cn')
print('one-shot:   ', blob.decode('iso-2022-cn'))
d = codecs.getincrementaldecoder('iso-2022-cn')()
print('incremental:', ''.join(d.decode(bytes([b])) for b in blob) + d.decode(b'', True))
one-shot:    ABC中文DEF
incremental: ABCVPNDDEF

codecs.iterdecode() and StreamReader.read(1) are wrong in the same way. A stateful encoding forced with the iconv: prefix is also affected, even when it has a built-in codec.

Either the codec objects need to keep one conversion across calls, or the iconv search function should refuse stateful encodings, which would make iso-2022-cn a LookupError.

The iconv codecs are new in 3.16 (gh-152997), so no released version is affected.

CPython versions tested on:

CPython main branch

Operating systems tested on:

Linux

Linked PRs
  • gh-154862

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Hướng nghiên cứu

Tái hiện ví dụ giải mã tăng dần cho codec dựa trên iconv, sau đó kiểm tra các luồng xử lý của bộ giải mã tăng dần, codecs.iterdecode() và StreamReader.read(1) được mô tả trong báo cáo. Công việc được xem là hoàn tất khi các encoding có trạng thái duy trì trạng thái chuyển đổi qua các lần gọi, hoặc hàm tìm kiếm nhất quán từ chối các encoding có trạng thái không được hỗ trợ, và các trường hợp được nêu đã được kiểm thử.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
python
Lĩnh vực
backend
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
35/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.