[Python-checkins] cpython (3.2): Issue #12687: Fix a possible buffering bug when unpickling text mode (protocol

antoine.pitrou python-checkins at python.org
Thu Aug 11 21:17:54 CEST 2011


http://hg.python.org/cpython/rev/c47bc1349e61
changeset: 71817:c47bc1349e61
branch: 3.2
parent: 71814:1e96a4406565
user: Antoine Pitrou <solipsis at pitrou.net>
date: Thu Aug 11 21:04:02 2011 +0200
summary:
 Issue #12687: Fix a possible buffering bug when unpickling text mode (protocol 0, mostly) pickles.
files:
 Lib/test/pickletester.py | 13 +++++++++++++
 Misc/NEWS | 3 +++
 Modules/_pickle.c | 3 +--
 3 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py
--- a/Lib/test/pickletester.py
+++ b/Lib/test/pickletester.py
@@ -1418,6 +1418,19 @@
 def test_multiple_unpicklings_unseekable(self):
 self._check_multiple_unpicklings(UnseekableIO)
 
+ def test_unpickling_buffering_readline(self):
+ # Issue #12687: the unpickler's buffering logic could fail with
+ # text mode opcodes.
+ data = list(range(10))
+ for proto in protocols:
+ for buf_size in range(1, 11):
+ f = io.BufferedRandom(io.BytesIO(), buffer_size=buf_size)
+ pickler = self.pickler_class(f, protocol=proto)
+ pickler.dump(data)
+ f.seek(0)
+ unpickler = self.unpickler_class(f)
+ self.assertEqual(unpickler.load(), data)
+
 
 if __name__ == "__main__":
 # Print some stuff that can be used to rewrite DATA{0,1,2}
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -41,6 +41,9 @@
 Library
 -------
 
+- Issue #12687: Fix a possible buffering bug when unpickling text mode
+ (protocol 0, mostly) pickles.
+
 - Issue #10087: Fix the html output format of the calendar module.
 
 - Issue #12540: Prevent zombie IDLE processes on Windows due to changes
diff --git a/Modules/_pickle.c b/Modules/_pickle.c
--- a/Modules/_pickle.c
+++ b/Modules/_pickle.c
@@ -1034,9 +1034,8 @@
 num_read = _Unpickler_ReadFromFile(self, READ_WHOLE_LINE);
 if (num_read < 0)
 return -1;
- *result = self->input_buffer;
 self->next_read_idx = num_read;
- return num_read;
+ return _Unpickler_CopyLine(self, self->input_buffer, num_read, result);
 }
 
 /* If we get here, we've run off the end of the input string. Return the
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /