You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
shutil.copyfile(): os.sendfile() fails with OverflowError on 32-bit system #82500
Traceback (most recent call last):
File "/buildbot/buildarea/cpython/3.x.ware-gentoo-x86.installed/build/target/lib/python3.9/test/test_largefile.py", line 160, in test_it
shutil.copyfile(TESTFN, TESTFN2)
File "/buildbot/buildarea/cpython/3.x.ware-gentoo-x86.installed/build/target/lib/python3.9/shutil.py", line 266, in copyfile
_fastcopy_sendfile(fsrc, fdst)
File "/buildbot/buildarea/cpython/3.x.ware-gentoo-x86.installed/build/target/lib/python3.9/shutil.py", line 145, in _fastcopy_sendfile
sent = os.sendfile(outfd, infd, offset, blocksize)
OverflowError: Python int too large to convert to C ssize_t
On Linux (Fedora 30), man sendfile shows me the prototype:
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
# Hopefully the whole file will be copied in a single call.
# sendfile() is called in a loop 'till EOF is reached (0 return)
# so a bufsize smaller or bigger than the actual file size
# should not make any difference, also in case the file content
# changes while being copied.
try:
blocksize = max(os.fstat(infd).st_size, 2 ** 23) # min 8MB
except Exception:
blocksize = 2 ** 27 # 128MB
I understand that the error comes from the 4th sendfile() parameter: "count". The C code (of the Linux implementation) uses the "n" format for Py_ssize_t: Python/getargs.c calls PyLong_AsSsize_t().
On a 64-bit system, it's less likely to reach Py_ssize_t maximum value (max = 2**63-1), but it's easy to reach on a 32-bit system (max = 2**31-1).
New changeset 94e1650 by Giampaolo Rodola in branch 'master': bpo-38319: Fix shutil._fastcopy_sendfile(): set sendfile() max block size (GH-16491) 94e1650
New changeset 938c00c by Łukasz Langa (Miss Islington (bot)) in branch '3.8': bpo-38319: Fix shutil._fastcopy_sendfile(): set sendfile() max block size (GH-16491) (bpo-16506) 938c00c
Activity
vstinner commentedon Sep 30, 2019
Error on a 32-bit buildbot worker where ssize_t maximum = 2,147,483,647 (2**31-1) bytes = ~2.0 GiB.
test_largefile uses:
x86 Gentoo Installed with X 3.x:
https://buildbot.python.org/all/#/builders/103/builds/3162
======================================================================
ERROR: test_it (test.test_largefile.TestCopyfile)
----------------------------------------------------------------------
On Linux (Fedora 30), man sendfile shows me the prototype:
Extract of Lib/shutil.py:
Extract of the Linux implementation of os.sendfile():
with:
I understand that the error comes from the 4th sendfile() parameter: "count". The C code (of the Linux implementation) uses the "n" format for Py_ssize_t: Python/getargs.c calls PyLong_AsSsize_t().
On a 64-bit system, it's less likely to reach Py_ssize_t maximum value (max = 2**63-1), but it's easy to reach on a 32-bit system (max = 2**31-1).
vstinner commentedon Sep 30, 2019
Oh, it's likely a regression caused by:
commit 5bcc6d8
Author: Giampaolo Rodola <g.rodola@gmail.com>
Date: Mon Sep 30 12:51:55 2019 +0800
configure:
checking for sendfile... yes
checking whether to enable large file support... yes
pythoninfo:
platform.libc_ver: glibc 2.29
platform.platform: Linux-4.19.72-gentoo-i686-AMD_Athlon-tm-_64_X2_Dual_Core_Processor_5000+-with-glibc2.29
vstinner commentedon Sep 30, 2019
Similar failure on ARMv7 Debian buster 3.x:
https://buildbot.python.org/all/#/builders/176/builds/1372
pythoninfo:
sys.maxsize: 2147483647
giampaolo commentedon Oct 1, 2019
New changeset 94e1650 by Giampaolo Rodola in branch 'master':
bpo-38319: Fix shutil._fastcopy_sendfile(): set sendfile() max block size (GH-16491)
94e1650
giampaolo commentedon Oct 1, 2019
Looks like it worked:
https://buildbot.python.org/all/#/builders/176/builds/1383
ambv commentedon Oct 1, 2019
New changeset 938c00c by Łukasz Langa (Miss Islington (bot)) in branch '3.8':
bpo-38319: Fix shutil._fastcopy_sendfile(): set sendfile() max block size (GH-16491) (bpo-16506)
938c00c
vstinner commentedon Oct 2, 2019
32-bit buildbots are back to green. Thanks for the fix!
pythongh-82500: Fix asyncio sendfile overflow on 32bit
gh-82500: Fix asyncio sendfile overflow on 32bit (#107056)
pythongh-82500: Fix asyncio sendfile overflow on 32bit (python#107056)
pythongh-82500: Fix asyncio sendfile overflow on 32bit (python#107056)