Skip to content

Commit c4ef311

Browse files
committed
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: https://github.com/apple/darwin-xnu/blob/a449c6a3b8014d9406c2ddbdc81795da24aa7443/bsd/kern/sys_generic.c#L355 rdar://68751407 Differential revision: https://reviews.llvm.org/D90201
1 parent 42f76e1 commit c4ef311

File tree

1 file changed

+13
-3
lines changed

1 file changed

+13
-3
lines changed

llvm/lib/Support/Unix/Path.inc

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,23 +1066,33 @@ file_t getStdoutHandle() { return 1; }
10661066
file_t getStderrHandle() { return 2; }
10671067

10681068
Expected<size_t> readNativeFile(file_t FD, MutableArrayRef<char> Buf) {
1069+
#if defined(__APPLE__)
1070+
size_t Size = std::min<size_t>(Buf.size(), INT32_MAX);
1071+
#else
1072+
size_t Size = Buf.size();
1073+
#endif
10691074
ssize_t NumRead =
1070-
sys::RetryAfterSignal(-1, ::read, FD, Buf.data(), Buf.size());
1075+
sys::RetryAfterSignal(-1, ::read, FD, Buf.data(), Size);
10711076
if (ssize_t(NumRead) == -1)
10721077
return errorCodeToError(std::error_code(errno, std::generic_category()));
10731078
return NumRead;
10741079
}
10751080

10761081
Expected<size_t> readNativeFileSlice(file_t FD, MutableArrayRef<char> Buf,
10771082
uint64_t Offset) {
1083+
#if defined(__APPLE__)
1084+
size_t Size = std::min<size_t>(Buf.size(), INT32_MAX);
1085+
#else
1086+
size_t Size = Buf.size();
1087+
#endif
10781088
#ifdef HAVE_PREAD
10791089
ssize_t NumRead =
1080-
sys::RetryAfterSignal(-1, ::pread, FD, Buf.data(), Buf.size(), Offset);
1090+
sys::RetryAfterSignal(-1, ::pread, FD, Buf.data(), Size, Offset);
10811091
#else
10821092
if (lseek(FD, Offset, SEEK_SET) == -1)
10831093
return errorCodeToError(std::error_code(errno, std::generic_category()));
10841094
ssize_t NumRead =
1085-
sys::RetryAfterSignal(-1, ::read, FD, Buf.data(), Buf.size());
1095+
sys::RetryAfterSignal(-1, ::read, FD, Buf.data(), Size);
10861096
#endif
10871097
if (NumRead == -1)
10881098
return errorCodeToError(std::error_code(errno, std::generic_category()));

0 commit comments

Comments
 (0)