mirror of https://github.com/python/cpython.git
![]() 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.
(cherry picked from commit
|
||
---|---|---|
.. | ||
clinic | ||
_iomodule.c | ||
_iomodule.h | ||
bufferedio.c | ||
bytesio.c | ||
fileio.c | ||
iobase.c | ||
stringio.c | ||
textio.c | ||
winconsoleio.c |