]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-89653: Add assertions on PyUnicode_READ() index (#92883)
authorVictor Stinner <vstinner@python.org>
Tue, 17 May 2022 17:43:19 +0000 (19:43 +0200)
committerGitHub <noreply@github.com>
Tue, 17 May 2022 17:43:19 +0000 (19:43 +0200)
Add assertions on the index argument of PyUnicode_READ(),
PyUnicode_READ_CHAR() and PyUnicode_WRITE() functions.

Include/cpython/unicodeobject.h

index f853b69dec9d1ad6a32f8a5d2bd56942bc8c347d..758aaff2d77d67e6fbfa9971297fe7fab538da8d 100644 (file)
@@ -304,6 +304,7 @@ static inline Py_ssize_t PyUnicode_GET_LENGTH(PyObject *op) {
 static inline void PyUnicode_WRITE(int kind, void *data,
                                    Py_ssize_t index, Py_UCS4 value)
 {
+    assert(index >= 0);
     if (kind == PyUnicode_1BYTE_KIND) {
         assert(value <= 0xffU);
         _Py_STATIC_CAST(Py_UCS1*, data)[index] = _Py_STATIC_CAST(Py_UCS1, value);
@@ -329,6 +330,7 @@ static inline void PyUnicode_WRITE(int kind, void *data,
 static inline Py_UCS4 PyUnicode_READ(int kind,
                                      const void *data, Py_ssize_t index)
 {
+    assert(index >= 0);
     if (kind == PyUnicode_1BYTE_KIND) {
         return _Py_STATIC_CAST(const Py_UCS1*, data)[index];
     }
@@ -351,7 +353,13 @@ static inline Py_UCS4 PyUnicode_READ(int kind,
    cache kind and use PyUnicode_READ instead. */
 static inline Py_UCS4 PyUnicode_READ_CHAR(PyObject *unicode, Py_ssize_t index)
 {
-    int kind = PyUnicode_KIND(unicode);
+    int kind;
+
+    assert(index >= 0);
+    // Tolerate reading the NUL character at str[len(str)]
+    assert(index <= PyUnicode_GET_LENGTH(unicode));
+
+    kind = PyUnicode_KIND(unicode);
     if (kind == PyUnicode_1BYTE_KIND) {
         return PyUnicode_1BYTE_DATA(unicode)[index];
     }