bpo-42237: Fix os.sendfile() on illumos (GH-23154)
This commit is contained in:
parent
877df851c3
commit
fd4ed57674
|
@ -0,0 +1 @@
|
||||||
|
Fix `os.sendfile()` on illumos.
|
|
@ -9873,11 +9873,26 @@ done:
|
||||||
if (offset >= st.st_size) {
|
if (offset >= st.st_size) {
|
||||||
return Py_BuildValue("i", 0);
|
return Py_BuildValue("i", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// On illumos specifically sendfile() may perform a partial write but
|
||||||
|
// return -1/an error (in one confirmed case the destination socket
|
||||||
|
// had a 5 second timeout set and errno was EAGAIN) and it's on the client
|
||||||
|
// code to check if the offset parameter was modified by sendfile().
|
||||||
|
//
|
||||||
|
// We need this variable to track said change.
|
||||||
|
off_t original_offset = offset;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
do {
|
do {
|
||||||
Py_BEGIN_ALLOW_THREADS
|
Py_BEGIN_ALLOW_THREADS
|
||||||
ret = sendfile(out_fd, in_fd, &offset, count);
|
ret = sendfile(out_fd, in_fd, &offset, count);
|
||||||
|
#if defined(__sun) && defined(__SVR4)
|
||||||
|
// This handles illumos-specific sendfile() partial write behavior,
|
||||||
|
// see a comment above for more details.
|
||||||
|
if (ret < 0 && offset != original_offset) {
|
||||||
|
ret = offset - original_offset;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
Py_END_ALLOW_THREADS
|
Py_END_ALLOW_THREADS
|
||||||
} while (ret < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
|
} while (ret < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
|
Loading…
Reference in New Issue