From 3d2dc057b0558fd321ef2bd1e9b150beeecb94a2 Mon Sep 17 00:00:00 2001 From: Justin Crown Date: Wed, 24 Mar 2021 16:32:45 -0400 Subject: [PATCH 1/5] allow max_buffer_size for instream --- src/clamd/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/clamd/__init__.py b/src/clamd/__init__.py index 92ff640..5316641 100644 --- a/src/clamd/__init__.py +++ b/src/clamd/__init__.py @@ -166,11 +166,13 @@ def _file_system_scan(self, command, file): finally: self._close_socket() - def instream(self, buff): + def instream(self, buff, max_chunk_size=1024): """ Scan a buffer buff filelikeobj: buffer to scan + max_chunk_size int: Maximum size of chunk to send to clamd in bytes + MUST be < StreamMaxLength in /etc/clamav/clamd.conf return: - (dict): {filename1: ("virusname", "status")} @@ -184,12 +186,10 @@ def instream(self, buff): self._init_socket() self._send_command('INSTREAM') - max_chunk_size = 1024 # MUST be < StreamMaxLength in /etc/clamav/clamd.conf - chunk = buff.read(max_chunk_size) while chunk: size = struct.pack(b'!L', len(chunk)) - self.clamd_socket.send(size + chunk) + self.clamd_socket.sendall(size + chunk) chunk = buff.read(max_chunk_size) self.clamd_socket.send(struct.pack(b'!L', 0)) From 51ee12faf79b0adf807039e0d06f1ab311394606 Mon Sep 17 00:00:00 2001 From: Justin Crown Date: Wed, 24 Mar 2021 16:50:27 -0400 Subject: [PATCH 2/5] all of the sendalls --- src/clamd/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/clamd/__init__.py b/src/clamd/__init__.py index 5316641..3262bab 100644 --- a/src/clamd/__init__.py +++ b/src/clamd/__init__.py @@ -192,7 +192,7 @@ def instream(self, buff, max_chunk_size=1024): self.clamd_socket.sendall(size + chunk) chunk = buff.read(max_chunk_size) - self.clamd_socket.send(struct.pack(b'!L', 0)) + self.clamd_socket.sendall(struct.pack(b'!L', 0)) result = self._recv_response() From 6282de2136895d1a6571cd9c598e85695aa82691 Mon Sep 17 00:00:00 2001 From: Justin Crown Date: Wed, 24 Mar 2021 16:51:10 -0400 Subject: [PATCH 3/5] sendall for all the alls --- src/clamd/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/clamd/__init__.py b/src/clamd/__init__.py index 3262bab..b3a3db7 100644 --- a/src/clamd/__init__.py +++ b/src/clamd/__init__.py @@ -231,7 +231,7 @@ def _send_command(self, cmd, *args): concat_args = ' ' + ' '.join(args) cmd = 'n{cmd}{args}\n'.format(cmd=cmd, args=concat_args).encode('utf-8') - self.clamd_socket.send(cmd) + self.clamd_socket.sendall(cmd) def _recv_response(self): """ From 04376cfba110717418dac8c5ed650625e7cff643 Mon Sep 17 00:00:00 2001 From: Justin Crown Date: Thu, 25 Mar 2021 08:55:19 -0400 Subject: [PATCH 4/5] set socket timeout before connect --- src/clamd/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/clamd/__init__.py b/src/clamd/__init__.py index b3a3db7..d9f57dc 100644 --- a/src/clamd/__init__.py +++ b/src/clamd/__init__.py @@ -63,8 +63,8 @@ def _init_socket(self): """ try: self.clamd_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.clamd_socket.connect((self.host, self.port)) self.clamd_socket.settimeout(self.timeout) + self.clamd_socket.connect((self.host, self.port)) except socket.error: e = sys.exc_info()[1] From 0ef0321317c9ee3b3167343a45a052660aa583d7 Mon Sep 17 00:00:00 2001 From: Justin Crown Date: Thu, 25 Mar 2021 09:27:23 -0400 Subject: [PATCH 5/5] add comment about connect and settimeout --- src/clamd/__init__.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/clamd/__init__.py b/src/clamd/__init__.py index d9f57dc..91c01ce 100644 --- a/src/clamd/__init__.py +++ b/src/clamd/__init__.py @@ -63,6 +63,9 @@ def _init_socket(self): """ try: self.clamd_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + # Set timeout prior to connecting to ensure that an initial + # connection timeout will respect the setting regardless of OS. + # https://docs.python.org/3/library/socket.html#timeouts-and-the-connect-method self.clamd_socket.settimeout(self.timeout) self.clamd_socket.connect((self.host, self.port))