Index: Lib/io.py =================================================================== --- Lib/io.py (revision 77904) +++ Lib/io.py (working copy) @@ -1200,6 +1200,10 @@ self.flush() # First do the raw seek, then empty the read buffer, so that # if the raw seek fails, we don't lose buffered data forever. + if self._read_buf and whence == 1: + # Undo read ahead. + with self._read_lock: + self.raw.seek(self._read_pos - len(self._read_buf), 1) pos = self.raw.seek(pos, whence) with self._read_lock: self._reset_read_buf() Index: Lib/test/test_io.py =================================================================== --- Lib/test/test_io.py (revision 77904) +++ Lib/test/test_io.py (working copy) @@ -107,6 +107,10 @@ self.assertEqual(f.truncate(12), 12) self.assertEqual(f.tell(), 13) + self.assertEqual(f.write(b"hij"), 3) + self.assertEqual(f.seek(0,1), 16) + self.assertEqual(f.tell(), 16) + self.assertEqual(f.truncate(12), 12) self.assertRaises(TypeError, f.seek, 0.0) def read_ops(self, f, buffered=False): @@ -129,6 +133,10 @@ self.assertEqual(f.seek(-6, 1), 5) self.assertEqual(f.read(5), b" worl") self.assertEqual(f.tell(), 10) + f.seek(0) + f.read(2) + f.seek(0, 1) + self.assertEqual(f.tell(), 2) self.assertRaises(TypeError, f.seek, 0.0) if buffered: f.seek(0) @@ -182,6 +190,13 @@ self.assertEqual(f.writable(), False) self.assertEqual(f.seekable(), True) self.read_ops(f, True) + f = io.open(test_support.TESTFN, "r+b") + self.assertEqual(f.readable(), True) + self.assertEqual(f.writable(), True) + self.assertEqual(f.seekable(), True) + self.write_ops(f) + f.seek(0) + self.read_ops(f, True) f.close() def test_readline(self): @@ -499,7 +514,7 @@ self.assertEquals(b"abcdefghijkl", writer._write_stack[0]) def testWriteNonBlocking(self): - raw = MockNonBlockWriterIO((9, 2, 22, -6, 10, 12, 12)) + raw = MockNonBlockWriterIO((9, 2, 10, -6, 10, 8, 12)) bufio = io.BufferedWriter(raw, 8, 16) bufio.write(b"asdf")