https://github.com/python/cpython/commit/92c14a91d239463c2f0ad72ab7e8a63de18ef8ca
commit: 92c14a91d239463c2f0ad72ab7e8a63de18ef8ca
branch: 3.14
author: Mohsin Mehmood <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2025-11-12T12:40:02+02:00
summary:
[3.14] gh-141314: Fix TextIOWrapper.tell() assertion failure with standalone
carriage return (GH-141331) (GH-141453)
The assertion was checking wrong variable (skip_back vs skip_bytes).
(cherry picked from commit af80fac42548719ede7241bfbab3c2c0775b4760)
files:
A Misc/NEWS.d/next/Library/2025-11-10-01-47-18.gh-issue-141314.baaa28.rst
M Lib/test/test_io.py
M Modules/_io/textio.c
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
index 2ed95530ba534a..6514af8b1253c3 100644
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -3337,6 +3337,24 @@ def test_multibyte_seek_and_tell(self):
self.assertEqual(f.tell(), p1)
f.close()
+ def test_tell_after_readline_with_cr(self):
+ # Test for gh-141314: TextIOWrapper.tell() assertion failure
+ # when dealing with standalone carriage returns
+ data = b'line1\r'
+ with self.open(os_helper.TESTFN, "wb") as f:
+ f.write(data)
+
+ with self.open(os_helper.TESTFN, "r") as f:
+ # Read line that ends with \r
+ line = f.readline()
+ self.assertEqual(line, "line1\n")
+ # This should not cause an assertion failure
+ pos = f.tell()
+ # Verify we can seek back to this position
+ f.seek(pos)
+ remaining = f.read()
+ self.assertEqual(remaining, "")
+
def test_seek_with_encoder_state(self):
f = self.open(os_helper.TESTFN, "w", encoding="euc_jis_2004")
f.write("\u00e6\u0300")
diff --git
a/Misc/NEWS.d/next/Library/2025-11-10-01-47-18.gh-issue-141314.baaa28.rst
b/Misc/NEWS.d/next/Library/2025-11-10-01-47-18.gh-issue-141314.baaa28.rst
new file mode 100644
index 00000000000000..37acaabfa3eada
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-11-10-01-47-18.gh-issue-141314.baaa28.rst
@@ -0,0 +1 @@
+Fix assertion failure in :meth:`io.TextIOWrapper.tell` when reading files with
standalone carriage return (``\r``) line endings.
diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c
index 5354cf63442599..a136987fb52a4a 100644
--- a/Modules/_io/textio.c
+++ b/Modules/_io/textio.c
@@ -2844,7 +2844,7 @@ _io_TextIOWrapper_tell_impl(textio *self)
current pos */
skip_bytes = (Py_ssize_t) (self->b2cratio * chars_to_skip);
skip_back = 1;
- assert(skip_back <= PyBytes_GET_SIZE(next_input));
+ assert(skip_bytes <= PyBytes_GET_SIZE(next_input));
input = PyBytes_AS_STRING(next_input);
while (skip_bytes > 0) {
/* Decode up to temptative start point */
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]