]> granicus.if.org Git - python/commitdiff
#17443: Fix buffering in IMAP4_stream.
authorR David Murray <rdmurray@bitdance.com>
Tue, 19 Mar 2013 17:52:33 +0000 (13:52 -0400)
committerR David Murray <rdmurray@bitdance.com>
Tue, 19 Mar 2013 17:52:33 +0000 (13:52 -0400)
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
Misc/ACKS
Misc/NEWS

index 00a17fbf36d3de0d7e559a95eb07dd6232639a7b..e2a05818fa617053c5f5c513aff4b49907135f4f 100644 (file)
@@ -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
index b5c80592f5cd9dba325903dbf32c3fed9c730b1e..6ea3f78d76ceb3d3659baebdb6cd3f29e8ac3e84 100644 (file)
--- 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
index 5e36c4215b11056e4534eec18f318564ec2d56fd..9a62a02bebe8504b63964c876985170ef3498a9d 100644 (file)
--- 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.