From b94e0cde60dbce9f99ecdd5e3846820c60a0f8bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charles-Fran=C3=A7ois=20Natali?= Date: Tue, 24 May 2011 23:10:54 +0200 Subject: [PATCH] Issue #1441530: In imaplib, use makefile() to wrap the SSL socket to avoid heap fragmentation and MemoryError with some malloc implementations. --- Lib/imaplib.py | 18 ++++-------------- Misc/NEWS | 3 +++ 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/Lib/imaplib.py b/Lib/imaplib.py index 569319118576..c576927a8b0e 100644 --- a/Lib/imaplib.py +++ b/Lib/imaplib.py @@ -1158,28 +1158,17 @@ def open(self, host = '', port = IMAP4_SSL_PORT): self.port = port self.sock = socket.create_connection((host, port)) self.sslobj = ssl.wrap_socket(self.sock, self.keyfile, self.certfile) + self.file = self.sslobj.makefile('rb') def read(self, size): """Read 'size' bytes from remote.""" - # sslobj.read() sometimes returns < size bytes - chunks = [] - read = 0 - while read < size: - data = self.sslobj.read(min(size-read, 16384)) - read += len(data) - chunks.append(data) - - return ''.join(chunks) + return self.file.read(size) def readline(self): """Read line from remote.""" - line = [] - while 1: - char = self.sslobj.read(1) - line.append(char) - if char in ("\n", ""): return ''.join(line) + return self.file.readline() def send(self, data): @@ -1195,6 +1184,7 @@ def send(self, data): def shutdown(self): """Close I/O established in "open".""" + self.file.close() self.sock.close() diff --git a/Misc/NEWS b/Misc/NEWS index 3d6815fa3791..6801fd7084a2 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -83,6 +83,9 @@ Core and Builtins Library ------- +- Issue #1441530: In imaplib, use makefile() to wrap the SSL socket to avoid + heap fragmentation and MemoryError with some malloc implementations. + - Issue #12100: Don't reset incremental encoders of CJK codecs at each call to their encode() method anymore, but continue to call the reset() method if the final argument is True.