1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-02-01 13:11:39 +01:00

Fix calls to (p)read on macOS when size > INT32_MAX

On macOS, the read and pread syscalls return EINVAL when the number of
bytes to read exceeds INT32_MAX:

a449c6a3b8/bsd/kern/sys_generic.c (L355)

rdar://68751407

Differential revision: https://reviews.llvm.org/D90201
This commit is contained in:
Jonas Devlieghere 2020-10-26 20:31:33 -07:00
parent f956540dd4
commit 7274d684e5

View File

@ -1066,8 +1066,13 @@ file_t getStdoutHandle() { return 1; }
file_t getStderrHandle() { return 2; }
Expected<size_t> readNativeFile(file_t FD, MutableArrayRef<char> Buf) {
#if defined(__APPLE__)
size_t Size = std::min<size_t>(Buf.size(), INT32_MAX);
#else
size_t Size = Buf.size();
#endif
ssize_t NumRead =
sys::RetryAfterSignal(-1, ::read, FD, Buf.data(), Buf.size());
sys::RetryAfterSignal(-1, ::read, FD, Buf.data(), Size);
if (ssize_t(NumRead) == -1)
return errorCodeToError(std::error_code(errno, std::generic_category()));
return NumRead;
@ -1075,14 +1080,19 @@ Expected<size_t> readNativeFile(file_t FD, MutableArrayRef<char> Buf) {
Expected<size_t> readNativeFileSlice(file_t FD, MutableArrayRef<char> Buf,
uint64_t Offset) {
#if defined(__APPLE__)
size_t Size = std::min<size_t>(Buf.size(), INT32_MAX);
#else
size_t Size = Buf.size();
#endif
#ifdef HAVE_PREAD
ssize_t NumRead =
sys::RetryAfterSignal(-1, ::pread, FD, Buf.data(), Buf.size(), Offset);
sys::RetryAfterSignal(-1, ::pread, FD, Buf.data(), Size, Offset);
#else
if (lseek(FD, Offset, SEEK_SET) == -1)
return errorCodeToError(std::error_code(errno, std::generic_category()));
ssize_t NumRead =
sys::RetryAfterSignal(-1, ::read, FD, Buf.data(), Buf.size());
sys::RetryAfterSignal(-1, ::read, FD, Buf.data(), Size);
#endif
if (NumRead == -1)
return errorCodeToError(std::error_code(errno, std::generic_category()));