summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Forcier <jeff@bitprophet.org>2023-01-10 22:43:19 -0500
committerJeff Forcier <jeff@bitprophet.org>2023-01-11 19:50:12 -0500
commit3bc0ddeb7c366ab82636e8b98b0989fd275cfd10 (patch)
tree58b938aa9f9f30062a8b50997f652495864fd079
parentd2a26df77081e7b389c6716bfbf45ac16a3bf291 (diff)
downloadparamiko-3bc0ddeb7c366ab82636e8b98b0989fd275cfd10.tar.gz
Put back the old faux-long(), kinda, in a few spots only
-rw-r--r--paramiko/sftp.py10
-rw-r--r--paramiko/sftp_client.py5
-rw-r--r--paramiko/sftp_file.py11
-rw-r--r--paramiko/sftp_server.py6
4 files changed, 25 insertions, 7 deletions
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: