From fcb6d6a3b3bfba67927ced18dd648ba889e14f4c Mon Sep 17 00:00:00 2001 From: R David Murray Date: Tue, 19 Mar 2013 13:52:33 -0400 Subject: [PATCH] #17443: Fix buffering in IMAP4_stream. In Python2 Popen uses *FILE objects, which wind up buffering even though subprocess defaults to no buffering. In Python3, subprocess streams really are unbuffered by default, but the imaplib code assumes read is buffered. This patch uses the default buffer size from the io module to get buffered streams from Popen. Much debugging work and patch by Diane Trout. The imap protocol is too complicated to write a test for this simple change with our current level of test infrastructure. --- Lib/imaplib.py | 2 ++ Misc/ACKS | 1 + Misc/NEWS | 4 ++++ 3 files changed, 7 insertions(+) diff --git a/Lib/imaplib.py b/Lib/imaplib.py index 00a17fbf36d..e2a05818fa6 100644 --- a/Lib/imaplib.py +++ b/Lib/imaplib.py @@ -23,6 +23,7 @@ Public functions: Internaldate2tuple __version__ = "2.58" import binascii, errno, random, re, socket, subprocess, sys, time, calendar +from io import DEFAULT_BUFFER_SIZE try: import ssl @@ -1237,6 +1238,7 @@ class IMAP4_stream(IMAP4): self.sock = None self.file = None self.process = subprocess.Popen(self.command, + bufsize=DEFAULT_BUFFER_SIZE, stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True, close_fds=True) self.writefile = self.process.stdin diff --git a/Misc/ACKS b/Misc/ACKS index b5c80592f5c..6ea3f78d76c 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1098,6 +1098,7 @@ Richard Townsend Nathan Trapuzzano Laurence Tratt John Tromp +Diane Trout Jason Trowbridge Brent Tubbs Anthony Tuininga diff --git a/Misc/NEWS b/Misc/NEWS index 5e36c4215b1..9a62a02bebe 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -233,6 +233,10 @@ Core and Builtins Library ------- +- Issue #17443: impalib.IMAP4_stream was using the default unbuffered IO + in subprocess, but the imap code assumes buffered IO. In Python2 this + worked by accident. IMAP4_stream now explicitly uses buffered IO. + - Issue #17476: Fixed regression relative to Python2 in undocumented pydoc 'allmethods'; it was missing unbound methods on the class.