]> granicus.if.org Git - python/commitdiff
Close #14085: remove assertions from PyUnicode_WRITE macro
authorVictor Stinner <victor.stinner@gmail.com>
Sun, 4 Mar 2012 00:34:37 +0000 (01:34 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Sun, 4 Mar 2012 00:34:37 +0000 (01:34 +0100)
Add checks in PyUnicode_WriteChar() and convert PyUnicode_New() assertion to a
test raising a Python exception.

Include/unicodeobject.h
Objects/unicodeobject.c

index 465d87b6f267de00c94c0530aee4af575c028f0b..8f7499509341979780a69904a00bbe4d6b2ef496 100644 (file)
@@ -499,17 +499,14 @@ enum PyUnicode_Kind {
     do { \
         switch ((kind)) { \
         case PyUnicode_1BYTE_KIND: { \
-            assert(value <= 0xff); \
             ((Py_UCS1 *)(data))[(index)] = (Py_UCS1)(value); \
             break; \
         } \
         case PyUnicode_2BYTE_KIND: { \
-            assert(value <= 0xffff); \
             ((Py_UCS2 *)(data))[(index)] = (Py_UCS2)(value); \
             break; \
         } \
         default: { \
-            assert(value <= 0x10ffff); \
             assert((kind) == PyUnicode_4BYTE_KIND); \
             ((Py_UCS4 *)(data))[(index)] = (Py_UCS4)(value); \
         } \
index a4dcdf61c219f61c61567d7a6927a0613e9ed471..b756afc5260980cbe2d1af133e73346df4a2c794 100644 (file)
@@ -998,7 +998,11 @@ PyUnicode_New(Py_ssize_t size, Py_UCS4 maxchar)
             is_sharing = 1;
     }
     else {
-        assert(maxchar <= MAX_UNICODE);
+        if (maxchar > MAX_UNICODE) {
+            PyErr_SetString(PyExc_SystemError,
+                            "invalid maximum character passed to PyUnicode_New");
+            return NULL;
+        }
         kind_state = PyUnicode_4BYTE_KIND;
         char_size = 4;
         if (sizeof(wchar_t) == 4)
@@ -3931,6 +3935,7 @@ PyUnicode_ReadChar(PyObject *unicode, Py_ssize_t index)
 int
 PyUnicode_WriteChar(PyObject *unicode, Py_ssize_t index, Py_UCS4 ch)
 {
+    Py_UCS4 maxchar;
     if (!PyUnicode_Check(unicode) || !PyUnicode_IS_COMPACT(unicode)) {
         PyErr_BadArgument();
         return -1;
@@ -3942,6 +3947,10 @@ PyUnicode_WriteChar(PyObject *unicode, Py_ssize_t index, Py_UCS4 ch)
     }
     if (unicode_check_modifiable(unicode))
         return -1;
+    if (ch > PyUnicode_MAX_CHAR_VALUE(unicode)) {
+        PyErr_SetString(PyExc_ValueError, "character out of range");
+        return -1;
+    }
     PyUnicode_WRITE(PyUnicode_KIND(unicode), PyUnicode_DATA(unicode),
                     index, ch);
     return 0;