FreeBSD: fix sendfile shim
authorJeremy Harris <jgh146exb@wizmail.org>
Sat, 7 Dec 2019 22:07:02 +0000 (22:07 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Sat, 7 Dec 2019 22:07:02 +0000 (22:07 +0000)
doc/doc-txt/ChangeLog
src/OS/Makefile-Base
src/OS/os.c-FreeBSD

index a8cd823b5825de738a2de052b84703b3a639de6e..9f18a20732ab2db08a0593bb7e403b4746992219 100644 (file)
@@ -218,6 +218,10 @@ JH/43 Bug 2465: Fix taint-handling in dsearch lookup.  Previously a nontainted
       buffer was used for the filename, resulting in a trap when tainted
       arguments (eg. $domain) were used.
 
       buffer was used for the filename, resulting in a trap when tainted
       arguments (eg. $domain) were used.
 
+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 9ecde1d3e71737868ddc57d2658dbfac2116abdc..36af8308d05333cb6a43623c7a4bbb2a4373c130 100644 (file)
@@ -79,23 +79,8 @@ Makefile: ../OS/Makefile-Base ../OS/Makefile-Default \
 
 # Build (link) the os.h file
 
 
 # Build (link) the os.h file
 
-#os.h: $(SCRIPTS)/Configure-os.h \
-#      $(O)/os.h-AIX           $(O)/os.h-BSDI  $(O)/os.h-cygwin \
-#      $(O)/os.h-Darwin        $(O)/os.h-DGUX  $(O)/os.h-DragonFly \
-#      $(O)/os.h-FreeBSD       $(O)/os.h-GNU   $(O)/os.h-GNUkFreeBSD \
-#      $(O)/os.h-GNUkNetBSD    $(O)/os.h-HI-OSF \
-#      $(O)/os.h-HI-UX         $(O)/os.h-HP-UX $(O)/os.h-HP-UX-9 \
-#      $(O)/os.h-IRIX          $(O)/os.h-IRIX6 $(O)/os.h-IRIX632 \
-#      $(O)/os.h-IRIX65        $(O)/os.h-Linux $(O)/os.h-mips \
-#      $(O)/os.h-NetBSD        $(O)/os.h-NetBSD-a.out \
-#      $(O)/os.h-OpenBSD       $(O)/os.h-OpenUNIX      $(O)/os.h-OSF1 \
-#      $(O)/os.h-QNX           $(O)/os.h-SCO           $(O)/os.h-SCO_SV \
-#      $(O)/os.h-SunOS4        $(O)/os.h-SunOS5        $(O)/os.h-SunOS5-hal \
-#      $(O)/os.h-ULTRIX        $(O)/os.h-UNIX_SV \
-#      $(O)/os.h-Unixware7     $(O)/os.h-USG
-#      $(SHELL) $(SCRIPTS)/Configure-os.h
-
 os.h:  $(SCRIPTS)/Configure-os.h \
 os.h:  $(SCRIPTS)/Configure-os.h \
+       $(O)/os.h-Darwin        \
        $(O)/os.h-FreeBSD       \
        $(O)/os.h-GNU           \
        $(O)/os.h-Linux         \
        $(O)/os.h-FreeBSD       \
        $(O)/os.h-GNU           \
        $(O)/os.h-Linux         \
@@ -105,17 +90,12 @@ os.h:      $(SCRIPTS)/Configure-os.h \
 
 # Build the os.c file
 
 
 # Build the os.c file
 
-#os.c:   ../src/os.c \
-#      $(SCRIPTS)/Configure-os.c \
-#      $(O)/os.c-cygwin        $(O)/os.c-GNU   $(O)/os.c-HI-OSF \
-#      $(O)/os.c-IRIX          $(O)/os.c-IRIX6 $(O)/os.c-IRIX632 \
-#      $(O)/os.c-IRIX65        $(O)/os.c-Linux $(O)/os.c-OSF1
-#      $(SHELL) $(SCRIPTS)/Configure-os.c
-
 os.c:   ../src/os.c \
        $(SCRIPTS)/Configure-os.c \
 os.c:   ../src/os.c \
        $(SCRIPTS)/Configure-os.c \
+       $(O)/os.c-FreeBSD       \
        $(O)/os.c-GNU           \
        $(O)/os.c-GNU           \
-       $(O)/os.c-Linux
+       $(O)/os.c-Linux         \
+       $(O)/os.c-SunOS5
        $(SHELL) $(SCRIPTS)/Configure-os.c
 
 # Build the config.h file.
        $(SHELL) $(SCRIPTS)/Configure-os.c
 
 # Build the config.h file.
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 */