]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] gh-127903: Fix a crash on debug builds when calling `Objects/unicodeobject...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Fri, 3 Jan 2025 19:20:30 +0000 (20:20 +0100)
committerGitHub <noreply@github.com>
Fri, 3 Jan 2025 19:20:30 +0000 (21:20 +0200)
gh-127903: Fix a crash on debug builds when calling `Objects/unicodeobject::_copy_characters`` (GH-127876)
(cherry picked from commit 46cb6340d7bad955edfc0a20f6a52dabc03b0932)

Co-authored-by: Alexander Shadchin <shadchin@yandex-team.com>
Lib/test/test_str.py
Misc/NEWS.d/next/Core_and_Builtins/2024-12-13-14-17-24.gh-issue-127903.vemHSl.rst [new file with mode: 0644]
Objects/unicodeobject.c

index a4c92a66aa1eb5e56196dd2b24b66c8a76f815f7..c4f59224a6fe6fe2aea19e68b024d3e39e2215f9 100644 (file)
@@ -7,6 +7,7 @@ Written by Marc-Andre Lemburg (mal@lemburg.com).
 """
 import _string
 import codecs
+import datetime
 import itertools
 import operator
 import pickle
@@ -1908,6 +1909,12 @@ class StrTest(string_tests.StringLikeTest,
             self.assertRaises(UnicodeDecodeError,
                               (b'\xF4'+cb+b'\xBF\xBF').decode, 'utf-8')
 
+    def test_issue127903(self):
+        # gh-127903: ``_copy_characters`` crashes on DEBUG builds when
+        # there is nothing to copy.
+        d = datetime.datetime(2013, 11, 10, 14, 20, 59)
+        self.assertEqual(d.strftime('%z'), '')
+
     def test_issue8271(self):
         # Issue #8271: during the decoding of an invalid UTF-8 byte sequence,
         # only the start byte and the continuation byte(s) are now considered
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2024-12-13-14-17-24.gh-issue-127903.vemHSl.rst b/Misc/NEWS.d/next/Core_and_Builtins/2024-12-13-14-17-24.gh-issue-127903.vemHSl.rst
new file mode 100644 (file)
index 0000000..ad479b5
--- /dev/null
@@ -0,0 +1,2 @@
+``Objects/unicodeobject.c``: fix a crash on DEBUG builds in ``_copy_characters``
+when there is nothing to copy.
index 7e61d615418722548373523707467f12c372fe3e..434cb5ffb61c0e590dcf9f4ebe10921e8403e963 100644 (file)
@@ -1495,11 +1495,14 @@ _copy_characters(PyObject *to, Py_ssize_t to_start,
     assert(PyUnicode_Check(from));
     assert(from_start + how_many <= PyUnicode_GET_LENGTH(from));
 
-    assert(PyUnicode_Check(to));
-    assert(to_start + how_many <= PyUnicode_GET_LENGTH(to));
+    assert(to == NULL || PyUnicode_Check(to));
 
-    if (how_many == 0)
+    if (how_many == 0) {
         return 0;
+    }
+
+    assert(to != NULL);
+    assert(to_start + how_many <= PyUnicode_GET_LENGTH(to));
 
     from_kind = PyUnicode_KIND(from);
     from_data = PyUnicode_DATA(from);