]> git.ipfire.org Git - thirdparty/Python/cpython.git/commit
gh-95782: Fix io.BufferedReader.tell() etc. being able to return offsets < 0 (GH...
author6t8k <58048945+6t8k@users.noreply.github.com>
Sat, 17 Feb 2024 11:16:06 +0000 (11:16 +0000)
committerGitHub <noreply@github.com>
Sat, 17 Feb 2024 11:16:06 +0000 (11:16 +0000)
commit26800cf25a0970d46934fa9a881c0ef6881d642b
tree94787f4406c4ab79490877d58612437787fd2068
parentd5a30a1777f04523c7b151b894e999f5714d8e96
gh-95782: Fix io.BufferedReader.tell() etc. being able to return offsets < 0 (GH-99709)

lseek() always returns 0 for character pseudo-devices like
`/dev/urandom` (for other non-regular files, e.g. `/dev/stdin`, it
always returns -1, to which CPython reacts by raising appropriate
exceptions). They are thus technically seekable despite not having seek
semantics.

When calling read() on e.g. an instance of `io.BufferedReader` that
wraps such a file, `BufferedReader` reads ahead, filling its buffer,
creating a discrepancy between the number of bytes read and the internal
`tell()` always returning 0, which previously resulted in e.g.
`BufferedReader.tell()` or `BufferedReader.seek()` being able to return
positions < 0 even though these are supposed to be always >= 0.

Invariably keep the return value non-negative by returning
max(former_return_value, 0) instead, and add some corresponding tests.
Lib/_pyio.py
Lib/test/test_io.py
Misc/NEWS.d/next/Library/2022-11-22-23-17-43.gh-issue-95782.an_and.rst [new file with mode: 0644]
Modules/_io/bufferedio.c