[Python-checkins] [3.9] bpo-41687: Fix sendfile implementation to work with Solaris (GH-22040) (GH-22273)

Łukasz Langa webhook-mailer at python.org
Wed Sep 16 07:52:53 EDT 2020


https://github.com/python/cpython/commit/7e356f17e4c91392b6fa45a512efc95923388813
commit: 7e356f17e4c91392b6fa45a512efc95923388813
branch: 3.9
author: Łukasz Langa <lukasz at langa.pl>
committer: GitHub <noreply at github.com>
date: 2020年09月16日T13:52:26+02:00
summary:
[3.9] bpo-41687: Fix sendfile implementation to work with Solaris (GH-22040) (GH-22273)
(cherry picked from commit 8c0be6fd9101746235b63ddfb84106d1e9ca286b)
Co-authored-by: Jakub Kulík <Kulikjak at gmail.com>
files:
A Misc/NEWS.d/next/Library/2020-09-01-15-57-51.bpo-41687.m1b1KA.rst
M Lib/test/test_asyncio/test_sendfile.py
M Modules/posixmodule.c
diff --git a/Lib/test/test_asyncio/test_sendfile.py b/Lib/test/test_asyncio/test_sendfile.py
index dbce199a9b8e1..1b1af08db0a13 100644
--- a/Lib/test/test_asyncio/test_sendfile.py
+++ b/Lib/test/test_asyncio/test_sendfile.py
@@ -445,6 +445,12 @@ def test_sendfile_ssl_close_peer_after_receiving(self):
 self.assertEqual(srv_proto.data, self.DATA)
 self.assertEqual(self.file.tell(), len(self.DATA))
 
+ # On Solaris, lowering SO_RCVBUF on a TCP connection after it has been
+ # established has no effect. Due to its age, this bug affects both Oracle
+ # Solaris as well as all other OpenSolaris forks (unless they fixed it
+ # themselves).
+ @unittest.skipIf(sys.platform.startswith('sunos'),
+ "Doesn't work on Solaris")
 def test_sendfile_close_peer_in_the_middle_of_receiving(self):
 srv_proto, cli_proto = self.prepare_sendfile(close_after=1024)
 with self.assertRaises(ConnectionError):
diff --git a/Misc/NEWS.d/next/Library/2020-09-01-15-57-51.bpo-41687.m1b1KA.rst b/Misc/NEWS.d/next/Library/2020-09-01-15-57-51.bpo-41687.m1b1KA.rst
new file mode 100644
index 0000000000000..284f500735701
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-09-01-15-57-51.bpo-41687.m1b1KA.rst
@@ -0,0 +1 @@
+Fix implementation of sendfile to be compatible with Solaris.
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index ddff28354a7c1..39f5f577a8286 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -9453,6 +9453,25 @@ os_sendfile_impl(PyObject *module, int out_fd, int in_fd, PyObject *offobj,
 if (!Py_off_t_converter(offobj, &offset))
 return NULL;
 
+#if defined(__sun) && defined(__SVR4)
+ // On Solaris, sendfile raises EINVAL rather than returning 0
+ // when the offset is equal or bigger than the in_fd size.
+ int res;
+ struct stat st;
+
+ do {
+ Py_BEGIN_ALLOW_THREADS
+ res = fstat(in_fd, &st);
+ Py_END_ALLOW_THREADS
+ } while (res != 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
+ if (ret < 0)
+ return (!async_err) ? posix_error() : NULL;
+
+ if (offset >= st.st_size) {
+ return Py_BuildValue("i", 0);
+ }
+#endif
+
 do {
 Py_BEGIN_ALLOW_THREADS
 ret = sendfile(out_fd, in_fd, &offset, count);


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /