summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2019-10-01 00:55:02 -0700
committerƁukasz Langa <lukasz@langa.pl>2019-10-01 09:55:02 +0200
commit938c00ca9e4207a2531041edff2e82490b02047f (patch)
treeeafde731b8c456239eae419e87e5c0ba0955201a
parentb3612070b746f799901443b65725008bc035872b (diff)
downloadcpython-git-938c00ca9e4207a2531041edff2e82490b02047f.tar.gz
bpo-38319: Fix shutil._fastcopy_sendfile(): set sendfile() max block size (GH-16491) (#16506)
(cherry picked from commit 94e165096fd65e8237e60de570fb609604ab94c9) Co-authored-by: Giampaolo Rodola <g.rodola@gmail.com>
-rw-r--r--Lib/shutil.py10
-rw-r--r--Lib/socket.py4
-rw-r--r--Misc/NEWS.d/next/Library/2019-09-30-22-06-33.bpo-38319.5QjiDa.rst2
3 files changed, 11 insertions, 5 deletions
diff --git a/Lib/shutil.py b/Lib/shutil.py
index 5c1255a671..1e89256cc3 100644
--- a/Lib/shutil.py
+++ b/Lib/shutil.py
@@ -135,9 +135,13 @@ def _fastcopy_sendfile(fsrc, fdst):
# 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
+ blocksize = max(os.fstat(infd).st_size, 2 ** 23) # min 8MiB
+ except OSError:
+ blocksize = 2 ** 27 # 128MiB
+ # On 32-bit architectures truncate to 1GiB to avoid OverflowError,
+ # see bpo-38319.
+ if sys.maxsize < 2 ** 32:
+ blocksize = min(blocksize, 2 ** 30)
offset = 0
while True:
diff --git a/Lib/socket.py b/Lib/socket.py
index af2ed0e76a..813f4ef5c3 100644
--- a/Lib/socket.py
+++ b/Lib/socket.py
@@ -355,8 +355,8 @@ class socket(_socket.socket):
raise _GiveupOnSendfile(err) # not a regular file
if not fsize:
return 0 # empty file
- blocksize = fsize if not count else count
-
+ # Truncate to 1GiB to avoid OverflowError, see bpo-38319.
+ blocksize = min(count or fsize, 2 ** 30)
timeout = self.gettimeout()
if timeout == 0:
raise ValueError("non-blocking sockets are not supported")
diff --git a/Misc/NEWS.d/next/Library/2019-09-30-22-06-33.bpo-38319.5QjiDa.rst b/Misc/NEWS.d/next/Library/2019-09-30-22-06-33.bpo-38319.5QjiDa.rst
new file mode 100644
index 0000000000..376a9e459d
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2019-09-30-22-06-33.bpo-38319.5QjiDa.rst
@@ -0,0 +1,2 @@
+sendfile() used in socket and shutil modules was raising OverflowError for
+files >= 2GiB on 32-bit architectures. (patch by Giampaolo Rodola)