Oops, I missed this one again (test_univnewlines fails):

Some incremental decoders return multiple characters, even when fed with
only one more byte. In this case the tell() state must subtract the
number of extra characters.
diff --git a/Lib/io.py b/Lib/io.py
index d2d2fbc..364e6d0 100644
--- a/Lib/io.py
+++ b/Lib/io.py
@@ -1283,7 +1283,7 @@
                     decoder_buffer, decoder_state = decoder.getstate()
                     return self._encode_decoder_state(
                         decoder_state,
-                        position + (i+1) - len(decoder_buffer))
+                        position + (i+1) - len(decoder_buffer) - (n - needed))
             raise IOError("Can't reconstruct logical file position")
         finally:
             decoder.setstate(saved_state)