https://github.com/python/cpython/commit/8402c28f111d20ad9d61f64873b743e2defc2603
commit: 8402c28f111d20ad9d61f64873b743e2defc2603
branch: 3.13
author: Mohsin Mehmood <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2025-11-12T12:40:14+02:00
summary:
[3.13] gh-141314: Fix TextIOWrapper.tell() assertion failure with standalone
carriage return (GH-141331) (GH-141452)
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 5d83464a0dd440..fab1a0d4e51e51 100644
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -3319,6 +3319,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 c1d8e16e12c722..047d0fdfc76770 100644
--- a/Modules/_io/textio.c
+++ b/Modules/_io/textio.c
@@ -2829,7 +2829,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]