From 3bc0ddeb7c366ab82636e8b98b0989fd275cfd10 Mon Sep 17 00:00:00 2001 From: Jeff Forcier Date: Tue, 10 Jan 2023 22:43:19 -0500 Subject: Put back the old faux-long(), kinda, in a few spots only --- paramiko/sftp.py | 10 ++++++++++ paramiko/sftp_client.py | 5 ++++- paramiko/sftp_file.py | 11 ++++++----- paramiko/sftp_server.py | 6 +++++- 4 files changed, 25 insertions(+), 7 deletions(-) (limited to 'paramiko') diff --git a/paramiko/sftp.py b/paramiko/sftp.py index 2e9dff66..c557d282 100644 --- a/paramiko/sftp.py +++ b/paramiko/sftp.py @@ -116,6 +116,16 @@ CMD_NAMES = { } +# TODO: rewrite SFTP file/server modules' overly-flexible "make a request with +# xyz components" so we don't need this very silly method of signaling whether +# a given Python integer should be 32- or 64-bit. +# NOTE: this only became an issue when dropping Python 2 support; prior to +# doing so, we had to support actual-longs, which served as that signal. This +# is simply recreating that structure in a more tightly scoped fashion. +class int64(int): + pass + + class SFTPError(Exception): pass diff --git a/paramiko/sftp_client.py b/paramiko/sftp_client.py index eaaf0dad..2a615345 100644 --- a/paramiko/sftp_client.py +++ b/paramiko/sftp_client.py @@ -60,6 +60,7 @@ from paramiko.sftp import ( SFTP_EOF, SFTP_NO_SUCH_FILE, SFTP_PERMISSION_DENIED, + int64, ) from paramiko.sftp_attr import SFTPAttributes @@ -827,8 +828,10 @@ class SFTPClient(BaseSFTP, ClosingContextManager): msg = Message() msg.add_int(self.request_number) for item in arg: - if isinstance(item, int): + if isinstance(item, int64): msg.add_int64(item) + elif isinstance(item, int): + msg.add_int(item) elif isinstance(item, SFTPAttributes): item._pack(msg) else: diff --git a/paramiko/sftp_file.py b/paramiko/sftp_file.py index 0975cba3..a80acd6d 100644 --- a/paramiko/sftp_file.py +++ b/paramiko/sftp_file.py @@ -42,6 +42,7 @@ from paramiko.sftp import ( CMD_ATTRS, CMD_FSETSTAT, CMD_EXTENDED, + int64, ) from paramiko.sftp_attr import SFTPAttributes @@ -183,7 +184,7 @@ class SFTPFile(BufferedFile): if data is not None: return data t, msg = self.sftp._request( - CMD_READ, self.handle, int(self._realpos), int(size) + CMD_READ, self.handle, int64(self._realpos), int(size) ) if t != CMD_DATA: raise SFTPError("Expected data") @@ -196,7 +197,7 @@ class SFTPFile(BufferedFile): type(None), CMD_WRITE, self.handle, - int(self._realpos), + int64(self._realpos), data[:chunk], ) self._reqs.append(sftp_async_request) @@ -406,8 +407,8 @@ class SFTPFile(BufferedFile): "check-file", self.handle, hash_algorithm, - int(offset), - int(length), + int64(offset), + int64(length), block_size, ) msg.get_text() # ext @@ -535,7 +536,7 @@ class SFTPFile(BufferedFile): # a lot of them, so it may block. for offset, length in chunks: num = self.sftp._async_request( - self, CMD_READ, self.handle, int(offset), int(length) + self, CMD_READ, self.handle, int64(offset), int(length) ) with self._prefetch_lock: self._prefetch_extents[num] = (offset, length) diff --git a/paramiko/sftp_server.py b/paramiko/sftp_server.py index 94c451f7..da97b090 100644 --- a/paramiko/sftp_server.py +++ b/paramiko/sftp_server.py @@ -32,6 +32,7 @@ from paramiko.sftp import ( SFTP_FAILURE, SFTP_PERMISSION_DENIED, SFTP_NO_SUCH_FILE, + int64, ) from paramiko.sftp_si import SFTPServerInterface from paramiko.sftp_attr import SFTPAttributes @@ -228,8 +229,11 @@ class SFTPServer(BaseSFTP, SubsystemHandler): msg = Message() msg.add_int(request_number) for item in arg: - if isinstance(item, int): + # NOTE: this is a very silly tiny class used for SFTPFile mostly + if isinstance(item, int64): msg.add_int64(item) + elif isinstance(item, int): + msg.add_int(item) elif isinstance(item, (str, bytes)): msg.add_string(item) elif type(item) is SFTPAttributes: -- cgit v1.2.1