5613df12040240ef2a0779bccd3e0916e7e0700a galt Fri Feb 18 12:01:15 2022 -0800 Fixing MacOS issue with readFd where single read call cannot ask for more than 2GB. fixes #28946 diff --git src/lib/common.c src/lib/common.c index ae70a18..2931580 100644 --- src/lib/common.c +++ src/lib/common.c @@ -2843,33 +2843,34 @@ else if ((flags & O_RDWR) == O_RDWR) modeName = " to append"; else modeName = " to read"; errnoAbort("mustOpenFd: Can't open %s%s", fileName, modeName); } return fd; } void mustReadFd(int fd, void *buf, size_t size) /* Read size bytes from a file or squawk and die. */ { ssize_t actualSize; char *cbuf = buf; // using a loop because linux was not returning all data in a single request when request size exceeded 2GB. +// MacOS complains invalid argument if it is over 2GB while (size > 0) { - actualSize = read(fd, cbuf, size); + actualSize = read(fd, cbuf, min(0x7FFF000,size)); // max 2GB 0x7FFF000 MAX_RW_COUNT = (INT_MAX & PAGE_MASK) if (actualSize < 0) errnoAbort("Error reading %lld bytes", (long long)size); if (actualSize == 0) errAbort("End of file reading %llu bytes (got %lld)", (unsigned long long)size, (long long)actualSize); cbuf += actualSize; size -= actualSize; } } void mustWriteFd(int fd, void *buf, size_t size) /* Write size bytes to file descriptor fd or die. (See man 2 write.) */ { ssize_t result = write(fd, buf, size); if (result < size) {