[libc-commits] [libc] [libc] Fix integer overflow for large offsets in lseek. (PR #162394)
Jackson Stogel via libc-commits
libc-commits at lists.llvm.org
Wed Oct 8 09:58:04 PDT 2025
https://github.com/jtstogel updated https://github.com/llvm/llvm-project/pull/162394
>From b1b84c619a547aea88ec7b41d511c3d973a5c0f0 Mon Sep 17 00:00:00 2001
From: Jackson Stogel <jtstogel at gmail.com>
Date: Tue, 7 Oct 2025 23:06:23 +0000
Subject: [PATCH] [libc] Fix integer overflow for large offsets in lseek.
---
libc/src/__support/File/linux/lseekImpl.h | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/libc/src/__support/File/linux/lseekImpl.h b/libc/src/__support/File/linux/lseekImpl.h
index c22a6c59b65f1..47df99ae84b90 100644
--- a/libc/src/__support/File/linux/lseekImpl.h
+++ b/libc/src/__support/File/linux/lseekImpl.h
@@ -25,8 +25,9 @@ namespace internal {
LIBC_INLINE ErrorOr<off_t> lseekimpl(int fd, off_t offset, int whence) {
off_t result;
#ifdef SYS_lseek
- int ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_lseek, fd, offset, whence);
- result = ret;
+ result = LIBC_NAMESPACE::syscall_impl<off_t>(SYS_lseek, fd, offset, whence);
+ if (result < 0)
+ return Error(-static_cast<int>(result));
#elif defined(SYS_llseek) || defined(SYS__llseek)
static_assert(sizeof(size_t) == 4, "size_t must be 32 bits.");
#ifdef SYS_llseek
@@ -37,11 +38,11 @@ LIBC_INLINE ErrorOr<off_t> lseekimpl(int fd, off_t offset, int whence) {
off_t offset_64 = offset;
int ret = LIBC_NAMESPACE::syscall_impl<int>(
LLSEEK_SYSCALL_NO, fd, offset_64 >> 32, offset_64, &result, whence);
+ if (ret < 0)
+ return Error(-ret);
#else
#error "lseek, llseek and _llseek syscalls not available."
#endif
- if (ret < 0)
- return Error(-ret);
return result;
}
More information about the libc-commits
mailing list