From 2a45cb39a6612acbc213cb292821d29a15a3a8e4 Mon Sep 17 00:00:00 2001 From: Robbert-Brand <142212423+Robbert-Brand@users.noreply.github.com> Date: Sun, 10 Dec 2023 19:04:09 +0100 Subject: [PATCH 1/3] Added default timeout on receive() to prevent disconnect hanging against server that died after connecting. --- src/smbprotocol/connection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/smbprotocol/connection.py b/src/smbprotocol/connection.py index be06a403..fe97abe0 100644 --- a/src/smbprotocol/connection.py +++ b/src/smbprotocol/connection.py @@ -989,7 +989,7 @@ def send_compound(self, messages, sid, tid, related=False): """ return self._send(messages, session_id=sid, tree_id=tid, related=related) - def receive(self, request, wait=True, timeout=None, resolve_symlinks=True): + def receive(self, request, wait=True, timeout=60, resolve_symlinks=True): """ Polls the message buffer of the TCP connection and waits until a valid message is received based on the message_id passed in. From 33cf7a11b9fd7864d3f0df8b51ba3b07cff2bb30 Mon Sep 17 00:00:00 2001 From: Robbert Brand Date: Sat, 6 Jan 2024 02:57:02 +0100 Subject: [PATCH 2/3] Added a default timeout when connecting --- src/smbclient/_pool.py | 4 ++-- src/smbprotocol/connection.py | 4 ++-- src/smbprotocol/session.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/smbclient/_pool.py b/src/smbclient/_pool.py index c5c8cf1f..3a7dc505 100644 --- a/src/smbclient/_pool.py +++ b/src/smbclient/_pool.py @@ -210,7 +210,7 @@ def dfs_request(tree: TreeConnect, path: str) -> DFSReferralResponse: return dfs_response -def delete_session(server, port=445, connection_cache=None): +def delete_session(server, port=445, connection_cache=None, timeout=60): """ Deletes the connection in the connection pool for the server specified. This will also close all sessions associated with the connection. @@ -226,7 +226,7 @@ def delete_session(server, port=445, connection_cache=None): connection = connection_cache.get(connection_key, None) if connection: del connection_cache[connection_key] - connection.disconnect(close=True) + connection.disconnect(close=True, timeout=timeout) def get_smb_tree( diff --git a/src/smbprotocol/connection.py b/src/smbprotocol/connection.py index fe97abe0..10132f22 100644 --- a/src/smbprotocol/connection.py +++ b/src/smbprotocol/connection.py @@ -931,7 +931,7 @@ def connect(self, dialect=None, timeout=60, preferred_encryption_algos=None, pre elif context_type == NegotiateContextType.SMB2_SIGNING_CAPABILITIES: self.signing_algorithm_id = context["data"]["signing_algorithms"][0] - def disconnect(self, close=True): + def disconnect(self, close=True, timeout=None): """ Closes the connection as well as logs off any of the Disconnects the TCP connection and shuts down the socket listener @@ -943,7 +943,7 @@ def disconnect(self, close=True): # We cannot close the session or tree if the socket has been closed. if close and self.transport.connected: for session in list(self.session_table.values()): - session.disconnect(True) + session.disconnect(True, timeout=timeout) log.info("Disconnecting transport connection") self.transport.close() diff --git a/src/smbprotocol/session.py b/src/smbprotocol/session.py index f521173f..d9a3481f 100644 --- a/src/smbprotocol/session.py +++ b/src/smbprotocol/session.py @@ -394,7 +394,7 @@ def connect(self): log.info("Verifying the SMB Setup Session signature as auth is successful") self.connection.verify_signature(response, self.session_id, force=True) - def disconnect(self, close=True): + def disconnect(self, close=True, timeout=None): """ Logs off the session @@ -418,7 +418,7 @@ def disconnect(self, close=True): request = self.connection.send(logoff, sid=self.session_id) log.info("Session: %s - Receiving Logoff response", self.username) - res = self.connection.receive(request) + res = self.connection.receive(request, timeout=timeout) res_logoff = SMB2Logoff() res_logoff.unpack(res["data"].get_value()) log.debug(res_logoff) From 8538957f6cb9a90d34488fee20621a7f313be800 Mon Sep 17 00:00:00 2001 From: Robbert Brand Date: Mon, 8 Jan 2024 01:44:35 +0100 Subject: [PATCH 3/3] Mistakenly forgot to change back the default of connection.receive() --- src/smbprotocol/connection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/smbprotocol/connection.py b/src/smbprotocol/connection.py index 10132f22..de7fc404 100644 --- a/src/smbprotocol/connection.py +++ b/src/smbprotocol/connection.py @@ -989,7 +989,7 @@ def send_compound(self, messages, sid, tid, related=False): """ return self._send(messages, session_id=sid, tree_id=tid, related=related) - def receive(self, request, wait=True, timeout=60, resolve_symlinks=True): + def receive(self, request, wait=True, timeout=None, resolve_symlinks=True): """ Polls the message buffer of the TCP connection and waits until a valid message is received based on the message_id passed in.