[PATCH v2 06/11] compat/pread: check initial lseek for errors
"Johannes Schindelin via GitGitGadget" <[email protected]> Wed, 05 Aug 2026 18:30:55 +0000
| Newsgroups | org.kernel.vger.git |
|---|---|
| Message-ID | <f0b1e13979bc41e10ac9fe7b042d8d4c1191c411.1785954661.git.gitgitgadget@gmail.com> |
From: Johannes Schindelin <[email protected]> git_pread() saves the current file offset via lseek(fd, 0, SEEK_CUR) and later restores it. If the initial lseek fails (e.g., the fd is a pipe or otherwise non-seekable), current_offset is -1. This negative value is later passed to lseek(fd, -1, SEEK_SET) at line 16, which sets the file position to an unintended location (or fails with EINVAL on some platforms). Check the initial lseek return value and return -1 immediately if it fails, consistent with the error handling for the other lseek calls in the same function. Pointed out by Coverity. Assisted-by: Claude Opus 4.6 Signed-off-by: Johannes Schindelin <[email protected]> --- compat/pread.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/compat/pread.c b/compat/pread.c index 484e6d4c71..ac7d058cb8 100644 --- a/compat/pread.c +++ b/compat/pread.c @@ -7,6 +7,8 @@ ssize_t git_pread(int fd, void *buf, size_t count, off_t offset) ssize_t rc; current_offset = lseek(fd, 0, SEEK_CUR); + if (current_offset < 0) + return -1; if (lseek(fd, offset, SEEK_SET) < 0) return -1; -- gitgitgadget