]> granicus.if.org Git - python/commitdiff
Issue #21118: Add unit test for invalid character replacement (code point higher...
authorVictor Stinner <victor.stinner@gmail.com>
Sat, 5 Apr 2014 09:56:37 +0000 (11:56 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Sat, 5 Apr 2014 09:56:37 +0000 (11:56 +0200)
Lib/test/test_unicode.py
Objects/unicodeobject.c

index 58dfa20519b282d534060662191bfe04804914e4..7fda51c21d70ea49ec83e985aed067b6f79c7a96 100644 (file)
@@ -280,6 +280,14 @@ class UnicodeTest(string_tests.CommonTest,
         self.assertEqual("[\xe9]".translate(str.maketrans({'\xe9': None})),
                          "[]")
 
+        # invalid Unicode characters
+        invalid_char = 0x10ffff+1
+        for before in "a\xe9\u20ac\U0010ffff":
+            mapping = str.maketrans({before: invalid_char})
+            text = "[%s]" % before
+            self.assertRaises(ValueError, text.translate, mapping)
+
+        # errors
         self.assertRaises(TypeError, self.type2test.maketrans)
         self.assertRaises(ValueError, self.type2test.maketrans, 'abc', 'defg')
         self.assertRaises(TypeError, self.type2test.maketrans, 2, 'def')
index 0386a871253696a28a9048d29a5249d116ad8a3c..21837739bc38202f0e9cdd24802369b1e9305e81 100644 (file)
@@ -8473,10 +8473,10 @@ charmaptranslate_lookup(Py_UCS4 c, PyObject *mapping, PyObject **result)
     }
     else if (PyLong_Check(x)) {
         long value = PyLong_AS_LONG(x);
-        long max = PyUnicode_GetMax();
-        if (value < 0 || value > max) {
-            PyErr_Format(PyExc_TypeError,
-                         "character mapping must be in range(0x%x)", max+1);
+        if (value < 0 || value > MAX_UNICODE) {
+            PyErr_Format(PyExc_ValueError,
+                         "character mapping must be in range(0x%x)",
+                         MAX_UNICODE+1);
             Py_DECREF(x);
             return -1;
         }
@@ -8522,7 +8522,9 @@ charmaptranslate_output(Py_UCS4 ch, PyObject *mapping,
     }
 
     if (PyLong_Check(item)) {
-        Py_UCS4 ch = (Py_UCS4)PyLong_AS_LONG(item);
+        long ch = (Py_UCS4)PyLong_AS_LONG(item);
+        /* PyLong_AS_LONG() cannot fail, charmaptranslate_lookup() already
+           used it */
         if (_PyUnicodeWriter_WriteCharInline(writer, ch) < 0) {
             Py_DECREF(item);
             return -1;
@@ -8570,11 +8572,9 @@ unicode_fast_translate_lookup(PyObject *mapping, Py_UCS1 ch,
 
     if (PyLong_Check(item)) {
         long replace = (Py_UCS4)PyLong_AS_LONG(item);
-        if (replace == -1) {
-            Py_DECREF(item);
-            return -1;
-        }
-        if (replace < 0 || 127 < replace) {
+        /* PyLong_AS_LONG() cannot fail, charmaptranslate_lookup() already
+           used it */
+        if (127 < replace) {
             /* invalid character or character outside ASCII:
                skip the fast translate */
             goto exit;