FreeBSD: fix sendfile shim
authorJeremy Harris <jgh146exb@wizmail.org>
Sat, 30 Nov 2019 17:39:25 +0000 (17:39 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Sat, 30 Nov 2019 17:39:25 +0000 (17:39 +0000)
Broken-by: 7d758a6a68
doc/doc-txt/ChangeLog
src/OS/os.c-FreeBSD

index 64198944a5c23df51daff3a0eb69af3bc290af8e..8a0b75edefd55e5442882fa0d57a223a6bc62236 100644 (file)
@@ -213,6 +213,10 @@ JH/45 local_scan API: documented the current smtp_printf() call. This changed
       adjustment for any calls to smtp_printf() to match the new function
       signature; a FALSE value for the new argument is always safe.
 
       adjustment for any calls to smtp_printf() to match the new function
       signature; a FALSE value for the new argument is always safe.
 
+JH/46 FreeBSD: fix use of the sendfile() syscall.  The shim was not updating
+      the file-offset (which the Linux syscall does, and exim expects); this
+      resulted in an indefinite loop.
+
 
 Exim version 4.92
 -----------------
 
 Exim version 4.92
 -----------------
index 1261b8557fdd351b6d9347d33fdb92de7323e1c6..4cc46c752a314094a22e34c3a743bf1dd0018e95 100644 (file)
@@ -2,7 +2,7 @@
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
-/* Copyright (c) Jeremy Harris 1995 - 2018 */
+/* Copyright (c) Jeremy Harris 1995 - 2019 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 /* FreeBSD-specific code. This is concatenated onto the generic
 /* See the file NOTICE for conditions of use and distribution. */
 
 /* FreeBSD-specific code. This is concatenated onto the generic
@@ -14,11 +14,13 @@ src/os.c file. */
 *************/
 
 ssize_t
 *************/
 
 ssize_t
-os_sendfile(int out, int in, off_t * off, size_t cnt)
+os_sendfile(int out, int in, off_t * offp, size_t cnt)
 {
 {
-off_t written;
-return sendfile(in, out, *off, cnt, NULL, &written, 0) < 0
-  ? (ssize_t) -1 : (ssize_t) written;
+off_t loff = *offp, written;
+
+if (sendfile(in, out, loff, cnt, NULL, &written, 0) < 0) return (ssize_t)-1;
+*offp = loff + written;
+return (ssize_t)written;
 }
 
 /* End of os.c-Linux */
 }
 
 /* End of os.c-Linux */