]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-127903: Fix a crash on debug builds when calling `Objects/unicodeobject::_copy_cha...
authorAlexander Shadchin <shadchin@yandex-team.com>
Fri, 3 Jan 2025 18:47:58 +0000 (21:47 +0300)
committerGitHub <noreply@github.com>
Fri, 3 Jan 2025 18:47:58 +0000 (18:47 +0000)
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 4de6c1cba152bde8dd8a84bdad3dc3c561cdb7d0..d1c9542c7d1317b957d13e2ca49c884fe69f6e43 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 9f0a4d4785eda6c78d10d74189424c8559ce9724..5e532ce0f348c4b1647906bf2bfe39d1ebb83784 100644 (file)
@@ -1463,11 +1463,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);