Skip to content

Conversation

@miss-islington
Copy link
Contributor

@miss-islington miss-islington commented Feb 17, 2024

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 26800cf)

Co-authored-by: 6t8k 58048945+6t8k@users.noreply.github.com

…n offsets < 0 (pythonGH-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. (cherry picked from commit 26800cf) Co-authored-by: 6t8k <58048945+6t8k@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

3 participants