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)
     {