]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-121849: Fix PyUnicodeWriter_WriteSubstring() crash if len=0 (#121896)
authorVictor Stinner <vstinner@python.org>
Wed, 17 Jul 2024 08:26:05 +0000 (10:26 +0200)
committerGitHub <noreply@github.com>
Wed, 17 Jul 2024 08:26:05 +0000 (10:26 +0200)
Do nothing if start=end.

Lib/test/test_capi/test_unicode.py
Objects/unicodeobject.c

index 9ef476a02de47d27293493c0d276b6ff7368573c..e6f85427214958734be274b27a0957abcec012fc 100644 (file)
@@ -1736,7 +1736,7 @@ class PyUnicodeWriterTest(unittest.TestCase):
         writer.write_char('=')
 
         # test PyUnicodeWriter_WriteSubstring()
-        writer.write_substring("[long]", 1, 5);
+        writer.write_substring("[long]", 1, 5)
 
         # test PyUnicodeWriter_WriteStr()
         writer.write_str(" value ")
@@ -1862,6 +1862,10 @@ class PyUnicodeWriterTest(unittest.TestCase):
         with self.assertRaises(ValueError):
             writer.write_ucs4("text", -1)
 
+    def test_substring_empty(self):
+        writer = self.create_writer(0)
+        writer.write_substring("abc", 1, 1)
+        self.assertEqual(writer.finish(), '')
 
 
 @unittest.skipIf(ctypes is None, 'need ctypes')
index 408d74fb3afef97a2188e496287cd3e68b847d1b..6196a8e766a15be00bea621a98bee423a5214ee2 100644 (file)
@@ -13637,27 +13637,28 @@ int
 _PyUnicodeWriter_WriteSubstring(_PyUnicodeWriter *writer, PyObject *str,
                                 Py_ssize_t start, Py_ssize_t end)
 {
-    Py_UCS4 maxchar;
-    Py_ssize_t len;
-
     assert(0 <= start);
     assert(end <= PyUnicode_GET_LENGTH(str));
     assert(start <= end);
 
-    if (end == 0)
-        return 0;
-
     if (start == 0 && end == PyUnicode_GET_LENGTH(str))
         return _PyUnicodeWriter_WriteStr(writer, str);
 
-    if (PyUnicode_MAX_CHAR_VALUE(str) > writer->maxchar)
+    Py_ssize_t len = end - start;
+    if (len == 0) {
+        return 0;
+    }
+
+    Py_UCS4 maxchar;
+    if (PyUnicode_MAX_CHAR_VALUE(str) > writer->maxchar) {
         maxchar = _PyUnicode_FindMaxChar(str, start, end);
-    else
+    }
+    else {
         maxchar = writer->maxchar;
-    len = end - start;
-
-    if (_PyUnicodeWriter_Prepare(writer, len, maxchar) < 0)
+    }
+    if (_PyUnicodeWriter_Prepare(writer, len, maxchar) < 0) {
         return -1;
+    }
 
     _PyUnicode_FastCopyCharacters(writer->buffer, writer->pos,
                                   str, start, len);