From 74d2332b35a3242f775bfadef02e22b39aed98cd Mon Sep 17 00:00:00 2001 From: Ivan Zhakov Date: Mon, 6 Feb 2023 13:03:08 +0000 Subject: Merge r1866932 from trunk: win32: Do not use TransmitFile directly. git-svn-id: https://svn.apache.org/repos/asf/apr/apr/branches/1.7.x@1907464 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 3 +++ CMakeLists.txt | 1 - libapr.mak | 8 ++++---- network_io/win32/sendrecv.c | 32 +++++++++++++++++++++++++------- 4 files changed, 32 insertions(+), 12 deletions(-) diff --git a/CHANGES b/CHANGES index 2a77d4dfa..f4b83a38e 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,9 @@ -*- coding: utf-8 -*- Changes for APR 1.7.3 + *) apr_socket_sendfile: Use WSAIoctl() to get TransmitFile function + pointer on Windows. + Changes for APR 1.7.2 *) Correct a packaging issue in 1.7.1. The contents of the release were diff --git a/CMakeLists.txt b/CMakeLists.txt index 2b9c5d844..9acabc912 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,7 +80,6 @@ SET(APR_INCLUDE_DIRECTORIES SET(APR_SYSTEM_LIBS ws2_32 - mswsock rpcrt4 ) diff --git a/libapr.mak b/libapr.mak index e998aec28..75fcf705d 100644 --- a/libapr.mak +++ b/libapr.mak @@ -173,7 +173,7 @@ BSC32_FLAGS=/nologo /o"$(OUTDIR)\libapr.bsc" BSC32_SBRS= \ LINK32=link.exe -LINK32_FLAGS=kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib shell32.lib rpcrt4.lib /nologo /base:"0x6EEC0000" /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\libapr-1.pdb" /debug /out:"$(OUTDIR)\libapr-1.dll" /implib:"$(OUTDIR)\libapr-1.lib" /opt:ref +LINK32_FLAGS=kernel32.lib advapi32.lib ws2_32.lib ole32.lib shell32.lib rpcrt4.lib /nologo /base:"0x6EEC0000" /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\libapr-1.pdb" /debug /out:"$(OUTDIR)\libapr-1.dll" /implib:"$(OUTDIR)\libapr-1.lib" /opt:ref LINK32_OBJS= \ "$(INTDIR)\apr_atomic.obj" \ "$(INTDIR)\apr_atomic64.obj" \ @@ -417,7 +417,7 @@ BSC32_FLAGS=/nologo /o"$(OUTDIR)\libapr.bsc" BSC32_SBRS= \ LINK32=link.exe -LINK32_FLAGS=kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib shell32.lib rpcrt4.lib /nologo /base:"0x6EEC0000" /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\libapr-1.pdb" /debug /out:"$(OUTDIR)\libapr-1.dll" /implib:"$(OUTDIR)\libapr-1.lib" +LINK32_FLAGS=kernel32.lib advapi32.lib ws2_32.lib ole32.lib shell32.lib rpcrt4.lib /nologo /base:"0x6EEC0000" /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\libapr-1.pdb" /debug /out:"$(OUTDIR)\libapr-1.dll" /implib:"$(OUTDIR)\libapr-1.lib" LINK32_OBJS= \ "$(INTDIR)\apr_atomic.obj" \ "$(INTDIR)\apr_atomic64.obj" \ @@ -661,7 +661,7 @@ BSC32_FLAGS=/nologo /o"$(OUTDIR)\libapr.bsc" BSC32_SBRS= \ LINK32=link.exe -LINK32_FLAGS=kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib shell32.lib rpcrt4.lib /nologo /base:"0x6EEC0000" /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\libapr-1.pdb" /debug /out:"$(OUTDIR)\libapr-1.dll" /implib:"$(OUTDIR)\libapr-1.lib" /opt:ref +LINK32_FLAGS=kernel32.lib advapi32.lib ws2_32.lib ole32.lib shell32.lib rpcrt4.lib /nologo /base:"0x6EEC0000" /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\libapr-1.pdb" /debug /out:"$(OUTDIR)\libapr-1.dll" /implib:"$(OUTDIR)\libapr-1.lib" /opt:ref LINK32_OBJS= \ "$(INTDIR)\apr_atomic.obj" \ "$(INTDIR)\apr_atomic64.obj" \ @@ -905,7 +905,7 @@ BSC32_FLAGS=/nologo /o"$(OUTDIR)\libapr.bsc" BSC32_SBRS= \ LINK32=link.exe -LINK32_FLAGS=kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib shell32.lib rpcrt4.lib /nologo /base:"0x6EEC0000" /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\libapr-1.pdb" /debug /out:"$(OUTDIR)\libapr-1.dll" /implib:"$(OUTDIR)\libapr-1.lib" +LINK32_FLAGS=kernel32.lib advapi32.lib ws2_32.lib ole32.lib shell32.lib rpcrt4.lib /nologo /base:"0x6EEC0000" /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\libapr-1.pdb" /debug /out:"$(OUTDIR)\libapr-1.dll" /implib:"$(OUTDIR)\libapr-1.lib" LINK32_OBJS= \ "$(INTDIR)\apr_atomic.obj" \ "$(INTDIR)\apr_atomic64.obj" \ diff --git a/network_io/win32/sendrecv.c b/network_io/win32/sendrecv.c index 6620e1382..4a01c0973 100644 --- a/network_io/win32/sendrecv.c +++ b/network_io/win32/sendrecv.c @@ -255,11 +255,29 @@ APR_DECLARE(apr_status_t) apr_socket_sendfile(apr_socket_t *sock, int disconnected = 0; int sendv_trailers = 0; char hdtrbuf[4096]; + LPFN_TRANSMITFILE pfn_transmit_file = NULL; + static GUID wsaid_transmitfile = WSAID_TRANSMITFILE; + DWORD dw; if (apr_os_level < APR_WIN_NT) { return APR_ENOTIMPL; } + /* According to documentation TransmitFile() should not be used directly. + * Pointer to function should retrieved using WSAIoctl: + * https://docs.microsoft.com/en-gb/windows/win32/api/mswsock/nf-mswsock-transmitfile#remarks + */ + if (WSAIoctl(sock->socketdes, SIO_GET_EXTENSION_FUNCTION_POINTER, + &wsaid_transmitfile, sizeof(wsaid_transmitfile), + &pfn_transmit_file, sizeof(pfn_transmit_file), + &dw, NULL, NULL) == SOCKET_ERROR) { + return apr_get_os_error(); + } + + if (dw != sizeof(pfn_transmit_file)) { + return APR_EINVAL; + } + /* Use len to keep track of number of total bytes sent (including headers) */ bytes_to_send = *len; *len = 0; @@ -351,13 +369,13 @@ APR_DECLARE(apr_status_t) apr_socket_sendfile(apr_socket_t *sock, sock->overlapped->OffsetHigh = (DWORD)(curoff >> 32); #endif /* XXX BoundsChecker claims dwFlags must not be zero. */ - rv = TransmitFile(sock->socketdes, /* socket */ - file->filehand, /* open file descriptor of the file to be sent */ - xmitbytes, /* number of bytes to send. 0=send all */ - 0, /* Number of bytes per send. 0=use default */ - sock->overlapped, /* OVERLAPPED structure */ - ptfb, /* header and trailer buffers */ - dwFlags); /* flags to control various aspects of TransmitFile */ + rv = pfn_transmit_file(sock->socketdes, /* socket */ + file->filehand, /* open file descriptor of the file to be sent */ + xmitbytes, /* number of bytes to send. 0=send all */ + 0, /* Number of bytes per send. 0=use default */ + sock->overlapped, /* OVERLAPPED structure */ + ptfb, /* header and trailer buffers */ + dwFlags); /* flags to control various aspects of TransmitFile */ if (!rv) { status = apr_get_netos_error(); if ((status == APR_FROM_OS_ERROR(ERROR_IO_PENDING)) || -- cgit v1.2.1